fork関数の注意点
#include
#include
#include
#include
// file operations the character\line\block functions contain the stream in the end.other not.
int main()
{
int num = 0;
pid_t pid;
printf("excute begin!
");
printf("processid:%d
",getpid());
if((pid = fork()) < 0){
//fprintf("%s","error fork
",stderr);
fprintf(stderr,"%s","error fork!
");
exit(EXIT_FAILURE);
}else if(pid == 0){// child process
num ++;
}else{
sleep(2);
}
printf("the num of process %d is %d,it's parent process is %d
",getpid(),num,getppid());
return 0;
}
上記のプログラムはfork()関数が最初から始まるかどうかをテストするために使用され、実験結果は次のようにはなりません.
huangkq@huangkq-Lenovo-G450:~/Desktop/Algorithms$ ./head excute begin! processid:2904 the num of process 2905 is 1,it's parent process is 2904 the num of process 2904 is 0,it's parent process is 2291
しかし、リダイレクトを使用すると、前のものは2回出力されますか?次のようになります.
huangkq@huangkq-Lenovo-G450:~/Desktop/Algorithms$ cat tmp.out
excute begin! processid:2909 the num of process 2910 is 1,it's parent process is 2909 excute begin! processid:2909 the num of process 2909 is 0,it's parent process is 2291
これは主にバッファの問題で、インタラクティブな方法でプログラムを実行します.すなわち、1つ目は行バッファで、標準出力キャッシュ領域は改行で洗い流されます.
次のリダイレクトはfork時にデータがキャッシュ領域にあり、サブプロセスにすべてコピーされ、親子プロセスが存在します.
しかし、processidは2909であることに気づくことができます.つまり、サブプロセスは実行を再開しません.