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

还是上一段DEMO程序:#include<stdio.h>#include<unistd.h>intmain(intargc,char*argv[]){inti;prin... 还是上一段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 ?
展开
 我来答
root栈
2013-05-23 · 超过10用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:26.4万
展开全部

把你的代码改动如下

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

百度网友166f0af
2013-04-28 · TA获得超过153个赞
知道小有建树答主
回答量:127
采纳率:0%
帮助的人:84.3万
展开全部
fork的时候,程序所有的代码都被复制了一份,所以实际子进程也在执行 for(....fork() ),所以有子进程是由子进程创建的。至于为什么有的是父,有的是子,这取决于系统调用。详细可参看:
http://zhidao.baidu.com/question/271299208.html

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

永远记住:fork就是克隆一个主进程,从fork开始,父子就没有区别了,它们都会继续各自的代码。
追问
谢谢!追问一下,这里打印出3行的child,也就是说这个for循环体创建了3个子进程,您能给大概分析一下是哪3个子进程吗 ? 
还有,这里的parent行的pid列和pgid列都是相同的,是否就是说在父进程没有创建任何子进程的时候,即进程组中只有一个父进程的情形下,此时父进程的pid就是父进程所在的进程组的pgid ?

还有谁能帮我回答一下啊,先谢谢了!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式