在一个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
http://zhidao.baidu.com/question/271299208.html
如果你的本意需要每个进程都是由父创建,代码需要修改,不能这样用。
永远记住:fork就是克隆一个主进程,从fork开始,父子就没有区别了,它们都会继续各自的代码。追问
谢谢!追问一下,这里打印出3行的child,也就是说这个for循环体创建了3个子进程,您能给大概分析一下是哪3个子进程吗 ?
还有,这里的parent行的pid列和pgid列都是相同的,是否就是说在父进程没有创建任何子进程的时候,即进程组中只有一个父进程的情形下,此时父进程的pid就是父进程所在的进程组的pgid ?
还有谁能帮我回答一下啊,先谢谢了!
以上是关于在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?的主要内容,如果未能解决你的问题,请参考以下文章
等到 for 循环内的所有函数调用结束其执行 - Javascript