#include < sys/types.h > #include < unistd.h > #include < stdio.h > static void printuid() { printf("uid = %d euid = %d\n", (int)getuid(), (int)geteuid()); } int main() { uid_t uid, euid; uid = getuid(); euid = geteuid(); printuid(); if (seteuid(uid) < 0){ perror("seteuid"); return 1; } printuid(); if (seteuid(euid)<0){ perror("seteuid"); return 1; } printuid(); return 0; }
Category: C++
プロセスの実ユーザID
getuid/geteuid/getgid/getegidは、それぞれ自分のプロセスの実ユーザID、実行ユーザID、実グループID、実行グループIDを取得します。
#include < unistd.h > #include < sys/types.h > #include < stdio.h > int main() { uid_t uid, euid; gid_t gid, egid; uid = getuid(); euid = geteuid(); gid = getgid(); egid = getegid(); printf("uid = %d, euid = %d, gid = %d, egid = %d\n", (int)uid, (int)euid, (int)gid, (int)egid); return 0; }
カレントディレクトリの変更
#include < unistd.h > #include < stdio.h > #include < stdlib.h > int main() { if (chdir("/tmp")< 0){ perror("chdir"); return 1; } system("pwd"); return 0; }
wait4プログラム
wait3に引数pidが増えただけです。
#include < sys/types.h > #include < sys/time.h > #include < sys/resource.h > #include < sys/wait.h > #include < unistd.h > #include < stdio.h > int main() { int status; pid_t pid; struct rusage usage; if ((pid = fork()) < 0){ perror("fork"); return 1; } else if (pid == 0){ write(1, "chlid process\n", 14); _exit(12); } write(1, "parent process\n", 15); if ((pid = wait4(pid, status, 0, &usage)) < 0){ perror("wait4"); return 1; } if(WIFEXITED(status)){ printf( "pid = %d exited with status = %d\n", (int)pid, WEXITSTATUS(status)); } printf( "user time = %ld.%06ld\n" "system time = %ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); return 0; }
wait3プログラム
#include < sys/types.h > #include < sys/time.h > #include < sys/resource.h > #include < sys/wait.h > #include < unistd.h > #include < stdio.h > int main() { int status; pid_t pid; struct rusage usage; if ((pid = fork())< 0){ perror("fork"); return 1; } else if (pid == 0){ write(1, "child process\n", 14); _exit(12); } write(1, "parent process\n", 15); if ((pid = wait3(&status, 0, &usage)) < 0) { perror("wait3"); return 1; } if(WIFEXITED(status)){ printf( "pid=%d exited with status = %d\n", (int)pid, WEXITSTATUS(status)); } printf( "user time = %ld.%06ld\n" "system time = %ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); return 0; }
wait pid
#include < sys/types.h > #include < sys/wait.h > #include < unistd.h > #include < stdio.h > int mian() { int status; pid_t pid; if ((pid = fork()) < 0){ perror("fork"); return 1; } else if (pid == 0){ write(1, "child process\n", 14); _exit(12); } write(1, "parent process\n", 15); if((pid = waitpid(pid, &status, 0)) < 0){ perror("waitpid"); return 1; } if(WIFEXITED(status)){ printf( "pid = %d exited with status = %d\n", (int)pid, WEXITSTATUS(status)); } return 0; }
プロセスの終了
#include < unistd.h > int main() { _exit(0); return 0; }
execveファイル
#include < unistd.h > #include < sys/types.h > #include < stdio.h > int main() { pid_t pid; char *argv[3]; extern char **environ; if((pid = fork())< 0){ perror("fork"); return 1; } else if(pid == 0){ argv[0]="echo"; argv[1]="Hello, from child"; argv[2]= NULL; execve("/bin/echo", argv, environ); _exit(1); } write(1, "Hello, from parent\n", 19); return 0; }
forkによる新しい子プロセスの作成
新しい子プロセスの作成には、forkを使います。
#include < sys/types.h > #include < unistd.h > #includeint main() { pid_t pid; if ((pid = fork()) < 0){ perror("fork"); return 1; } else if (pid == 0){ write(1, "child process\n", 14); _exit(0); } write(1, "parent process\n", 15); return 0; }
ハッシュサーチ
ハッシュサーチは検索は圧倒的に高速です。データをテーブルに格納する際に簡単な式でキーを割り当て、そのキーでダイレクトに飛べる場所にデータを格納しておきます。
#include#include #include #define HASH_SIZE 4096 static char **Str[HASH_SIZE]; static int Strmax[HASH_SIZE]; int strno(char *str) { static char *null=""; char *p,*ptr,*ptrc; int i; unsigned n; if(str==NULL){ ptr=null; } else{ ptr=str; } n=0; for(ptrc=ptr;(*ptrc)!='\0';ptrc++){ n+=(unsigned)(*ptrc); } n%=HASH_SIZE; for(i=0;i