把你的代码改动如下
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
fork的时候,程序所有的代码都被复制了一份,所以实际子进程也在执行 for(....fork() ),所以有子进程是由子进程创建的。至于为什么有的是父,有的是子,这取决于系统调用。详细可参看:
http://zhidao.baidu.com/question/271299208.html
如果你的本意需要每个进程都是由父创建,代码需要修改,不能这样用。
永远记住:fork就是克隆一个主进程,从fork开始,父子就没有区别了,它们都会继续各自的代码。