首先,fork()系统调用的特性:
- fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
- 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
1 int main(){ 2 int i; 3 for( i=0;i<2;i++){ 4 fork(); 5 printf("#"); 6 } 7 return 0; 8 }
该结果输出8个#而非6个,原因是fork()函数的第二个特性,父进程printf()函数的缓存区被复制到子进程的空间,因此多了两个#。
只要把printf("#")改成printf("#\n") 或者加一句fflush(stdout) 结果就是6.
注意,该进程一共产生了3个子进程,共计四个进程。
那么,把for循环中的2改成3 会输出多少个#呢?
答案是24个! 一共有8个进程。
1 int main(){ 2 int i; 3 printf("halo\n"); 4 for( i=0;i<3;i++){ 5 fork(); 6 printf("#"); 7 } 8 return 0; 9 }
那么结果如何呢? 如下所示:
1 halo 2 ########
再看一例:
1 static int i=0; 2 3 int main(){ 4 i++; 5 fork(); 6 fork(); 7 fork(); 8 sleep(1); 9 printf("%d\n",i); 10 }
结果如下:
1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1