它的执行结果是: father son father father father father son son father son son son father son 这里就不做详细解释了,只做一个大概的分析。 for i=0 1 2 father father father son son father son son father father son son father son 其中每一行分别代表一个进程的运行打印结果。 总结一下规律,对于这种N次循环的情况,执行printf函数的次数为2*(1+2+4+……+2N-1)次,创建的子进程数为1+2+4+……+2N-1个。 数学推理见-->http://blog.chinaunix.net/uid-26495963-id-3150121.html。 同时,大家如果想测一下一个程序中到底创建了几个子进程,最好的方法就是调用printf函数打印该进程的pid,也即调用printf("%d\n",getpid());或者通过printf("+\n");来判断产生了几个进程。有人想通过调用printf("+");来统计创建了几个进程,这是不妥当的。具体原因我来分析。 老规矩,大家看一下下面的代码:
点击(此处)折叠或打开
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid;//pid表示fork函数返回的值
//printf("fork!");
printf("fork!/n");
pid = fork();
if(pid < 0)
printf("error in fork!");
elseif(pid == 0)
printf("I am the child process, my process id is %d/n", getpid());
else
printf("I am the parent process, my process id is %d/n", getpid());
return 0;
}
执行结果如下: fork! I am the parent process, my process id is 3361 I am the child process, my process id is 3362 如果把语句printf("fork!\n");注释掉,执行printf("fork!"); 则新的程序的执行结果是: fork!I am the parent process, my process id is 3298 fork!I am the child process, my process id is 3299 程序的唯一的区别就在于一个\n回车符号,为什么结果会相差这么大呢? 这就跟printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有\n 则会立即刷新stdout,因此就马上能够打印了。 运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,程序运行到fork时缓冲里面的“fork!” 被子进程复制过去了。因此在子进程度stdout缓冲里面就也有了fork! 。所以,你最终看到的会是fork! 被printf了2次!!!! 而运行printf("fork!\n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 内容。因此你看到的结果会是fork! 被printf了1次!!!! 所以说printf("+");不能正确地反应进程的数量。 大家看了这么多可能有点疲倦吧,不过我还得贴最后一份代码来进一步分析fork函数。