由于这篇会比较长,所以就不接在上一篇后面了,在此再开一篇.这里说说和fork有关的两个比较有趣的程序

第一个是这样的[一组,一共两个程序对比]

#include ;
#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。
这个比喻就像真正的父子,孩子长大了生了小孩,孩子就成了父亲。而父亲永远是父亲。

我自己试验的时候的结果如下:

Comments

2010-12-31