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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?相关的知识,希望对你有一定的参考价值。

还是上一段DEMO程序:
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])

int i;
printf("\tpid\t ppid \t pgid\n");
printf("parent\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
for(i=0;i<2;i++)
if(fork()==0)
printf("child\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
return 0;


这段程序的两次执行结果分别如下:

pid ppid pgid
parent 7078 6817 7078
child 7079 7078 7078
child 7080 7079 7078
child 7081 7078 7078
××××××××××××××××××××××××××××××××××××××××××××××××××××××××
pid ppid pgid
parent 7084 6817 7084
child 7085 7084 7084
child 7087 7084 7084
child 7086 7085 7084

pid列没有疑问,其他两列就有两个疑问了
1. 3个child进程的ppid列,此时求得的ppid有的是parent进程的pid,有的是child进程的pid,也就是说for循环体内的子进程有的是父进程创建的,有的是for循环体内的某个子进程创建的 ? 为什么不都是外面的父进程创建的呢 ?

2. getpgid(0)表示获取当前进程的进程组号,就是说使用fork()创建的多个子进程与父进程具有相同的pgid ?

把你的代码改动如下

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

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

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

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

谢谢!追问一下,这里打印出3行的child,也就是说这个for循环体创建了3个子进程,您能给大概分析一下是哪3个子进程吗 ?
还有,这里的parent行的pid列和pgid列都是相同的,是否就是说在父进程没有创建任何子进程的时候,即进程组中只有一个父进程的情形下,此时父进程的pid就是父进程所在的进程组的pgid ?

还有谁能帮我回答一下啊,先谢谢了!

以上是关于在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA,关于for循环,循环体里的问题

仅在元素完全加载时执行一次的函数

等到 for 循环内的所有函数调用结束其执行 - Javascript

0125 双重for循环:语法执行思路打印m行n列打印倒三角形正三角九九乘法表

如何在一个循环执行ajax方法里面嵌套的ajax方法

每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行