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であることに気づくことができます.つまり、サブプロセスは実行を再開しません.