Linux应用程序中出现两次fork的解释

Linux应用程序中出现两次fork的解释,第1张

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

在一些程序中经常看见使用两次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出来的。其中的逻辑关系从打印出来的进程号就可以一目了然了,我就不赘述了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7310116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存