#include < unistd.h >
#include < stdio.h >
#include < stdlib.h >
int main()
{
if (chdir("/tmp")< 0){
perror("chdir");
return 1;
}
system("pwd");
return 0;
}
getpid/getppid
自分または親のプロセスID
#include < sys/types.h > #include < unistd.h > #includeint main() { pid_t pid, ppid; pid = getpid(); ppid = getppid(); printf("pid = %d, ppid = %d\n", (int)pid, (int)ppid); 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
バイナリサーチ
バイナリサーチは条件として、データが昇順にソートされている必要があります。ソートは一般的に検索よりも時間がかかります。
#include < stdio.h >
#include < search.h >
int cmp_func(int *a,int *b)
{
return((*a)-(*b));
}
void main()
{
static int ary[10]={2,4,1,3,5,7,9,6,8,0};
static int target=5;
int *ptr;
qsort(ary,10,sizeof(int),cmp_func);
ptr=(int *)bsearch(&target,ary,10,sizeof(int),cmp=func);
if(ptr!=NULL){
printf("target is ary[%d]\n",ptr-ary);
}
else{
printf("target not found\n");
}
}