在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?

2024年12月05日 00:51
有2个网友回答
网友(1):

把你的代码改动如下

printf("child%i\t%d\t%d\t%d\n",i,getpid(),getppid(),getpgid(0));

下面是执行结果

    pid     ppid      pgid
parent    28254    24953    28254
child0    28255    28254    28254
child1    28256    28254    28254
child1    28257    28255    28254
在for第一次循环中pid 为28254的parent进程创建child0子进程。在for第二次循环中,注意这里已经有2个进程了,parent,child0, 他们分别调用fork, parent进程创建pid为28256的child1子进程,child0创建28257子进程,这样的结果是根据child1的ppid得出的!


第二个问题:每个进程除了pid外还有一个pgid, 开始执行一个新程序时,进程组的id等于进程的pid。然后创建新进程,新的进程进程组id以及会话id都继承自父进程, 也就是他们都相同。如果想改变也可以, 子进程自己调用setpgid就行了


http://www.gnu.org/software/libc/manual/html_node/Concepts-of-Job-Control.html#Concepts-of-Job-Control

网友(2):

fork的时候,程序所有的代码都被复制了一份,所以实际子进程也在执行 for(....fork() ),所以有子进程是由子进程创建的。至于为什么有的是父,有的是子,这取决于系统调用。详细可参看:
http://zhidao.baidu.com/question/271299208.html

如果你的本意需要每个进程都是由父创建,代码需要修改,不能这样用。

永远记住:fork就是克隆一个主进程,从fork开始,父子就没有区别了,它们都会继续各自的代码。