Linux-fork(2)
由于这篇会比较长,所以就不接在上一篇后面了,在此再开一篇.这里说说和fork有关的两个比较有趣的程序
第一个是这样的[一组,一共两个程序对比]
#include
int main ()
{
pid_t pid
printf(“fork”);//注意这句和下面的区别
pid=fork();
if (pid < 0)
printf(“error in fork!”);
else if (pid == 0)
printf(“i am the child process, my process id is %dn”,getpid());
else
printf(“i am the parent process, my process id is %dn”,getpid());
retrun 0
}
#include
#include
int main ()
{
pid_t pid
printf(“fork\n”);//注意这句和下面的区别
pid=fork();
if (pid < 0)
printf(“error in fork!”);
else if (pid == 0)
printf(“i am the child process, my process id is %dn”,getpid());
else
printf(“i am the parent process, my process id is %dn”,getpid());
return 0
}
上面的两个会输出什么呢?
。
。
。
。
答案是
第一个输出:
forki am the child process, my process id is 2955
forki am the child process, my process id is 2954
第二个的输出是
fork
i am the child process, my process id is 2955
i am the child process, my process id is 2954
是不是觉得和我昨天说的不一样呢?怎么第一个中的fork输出两次呢?这里就和printf的缓冲有关了,具体的可以参考这里
下面的是转自这里
我试验了下,结果和博主的相似.
.给你两分钟抢答时间
.
.
.
.
.
.
.
.
OK,答案来了.
对一下答案吧:[这分析和结果是复制过来的.]
[hardy@localhost fork]$ ./fork
father
son
son
son
father
father
son
father
son
son
father
father
son
father
总共7个son7个father。你答对了么?
这道题需要在纸上画画才好理解[由于格式会不对,所以我用图片,速度不给力的还请见谅]
其中每一行分别代表一个进程的运行打印结果。
当产生子进程的时刻,子进程打印son,当子进程调用fork的生成子子进程,他就提升为father。
总结来说,father永远打印father,son在fork之前是son,fork之后就为father,同时生成新的son。
这个比喻就像真正的父子,孩子长大了生了小孩,孩子就成了父亲。而父亲永远是父亲。
我自己试验的时候的结果如下: