在一些程序中经常看见使用两次fork创建子进程,原因如下:
以下摘自《UNIX环境高级编程》
如果一个进程fork一个子进程,但不要它等待子进程终止,也不希望子进程处于僵死状态直到父进程终止,实现这一要求的技巧是调用fork两次。程序如下:
#include
"apue.h"
#include
<sys/wait.h>
int
main(void)
{
fork就是拷贝代码比如
.......
pid = fork() //父进程得到的pid是子进程的进程编号
if(pid == 0)
{
//子进程
}
else
{
....//父进程
}
....//父子进程均会执行的代码段,尽量不要让代码跑到这 会很难控制
不止三个,子进程仍然在循环体内,所以子进程也会根据它的i值来做循环,然后fork子进程的子进程,但是你的程序也有问题,父进程打印后没有等待子进程运行结束就return了,这样有些子进程还来不仅运行就退出了。所以你的程序的输出结果是不可靠的,也是可能是随机的(其结果会根据运行时 *** 作系统的具体调度的不同而不同)。所以我给你改了一下,这样就能让所有被fork的子进程(包括这些子进程再次fork出来的子进程)都有机会运行。int main()
{
int i
int my_pid
int chld_pid
for( i= 0i<3i++)
{
chld_pid= fork()
if(chld_pid== 0) {
my_pid = getpid()
printf("i = %d, child pid %d\n", i, my_pid)
}
else {
my_pid = getpid()
printf("i = %d, parent pid %d, child pid %d\n",i, my_pid, chld_pid)
wait(0)/*waiting for the completion of child */
}
}
return 0
}
运行后的结果为:
i = 0, parent pid 5294, child pid 5295
i = 0, child pid 5295
i = 1, parent pid 5295, child pid 5296
i = 1, child pid 5296
i = 2, parent pid 5296, child pid 5297
i = 2, child pid 5297
i = 2, parent pid 5295, child pid 5298
i = 2, child pid 5298
i = 1, parent pid 5294, child pid 5299
i = 1, child pid 5299
i = 2, parent pid 5299, child pid 5300
i = 2, child pid 5300
i = 2, parent pid 5294, child pid 5301
i = 2, child pid 5301
这样你就可以看到,实际上有7个子进程被fork出来,其中有3个是被真正的父进程(5294)fork出来的,而其余的则是被5294的子进程(甚至子进程的子进程)所fork出来的。其中的逻辑关系从打印出来的进程号就可以一目了然了,我就不赘述了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)