- 论坛徽章:
- 0
|
原帖由 naker 于 2006-11-7 19:25 发表
应该是不会的,别看没有exit,但我调用的是exec。你看了我上面的帖子就知道了,exec把它后面的东西都覆盖掉了,就算写了也白写,这是一。二,本质上说exec又被你调动的程序代替,所以不用担心。程序都写好了,你 ...
程序如下:
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int i;
for(i=0;i<3;i++)
{
if( (pid=fork()) < 0)
fprintf(stdout, "fork error on %d\n",i);
else if( pid > 0)
printf("parent fork %d\n",i);
else
printf("child fork %d\n", i);
}
exit(0);
}
执行结果:
parent fork 0
child fork 0
parent fork 1
parent fork 1
child fork 1
parent fork 2
parent fork 2
parent fork 2
child fork 1
parent fork 2
child fork 2
child fork 2
child fork 2
child fork 2
初步分析:
第一层循环3次i=0,1,2)
parent fork 0
parent fork 1
parent fork 2
child fork 0(进程1,初始i=0)
child fork 1(进程2,初始i=1)
child fork 2(进程3,初始i=2)
第二层进程1循环2次i=1,2)
parent fork 1
parent fork 2
child fork 1(进程4,初始i=1)
child fork 2(进程5,初始i=2)
第二层进程2循环1次i=2)
parent fork 2
child fork 2(进程6,初始i=2)
第三层进程4循环1次i=2)
parent fork 2
child fork 2(进程7,初始i=2)
这个问题不知道是不是你所说的没有等待的原因,我现在没有环境,所以没试验!
如果在之进程中写exit的话,程序就不会产生孙子进程了。
另外还有就是:
int main()
{
pid_t pid;
int i = 0;
printf("asfsda\n");
for(i=0;i<3;i++)
while(1)
{
if( (pid=fork()) < 0)
fprintf(stdout, "fork error on %d\n",i);
else if( pid > 0)
printf("parent fork %d\n",i);
else
{
printf("child fork %d\n", i);
//exit(0); //不明白的地方
}
}
return(0);
}
(1)加exit(0);结果:
asfsda
parent fork 0
parent fork 1
child fork 0
child fork 1
child fork 2
parent fork 2
不加exit(0);结果:
asfsda
parent fork 0
parent fork 1
parent fork 2
child fork 0
parent fork 1
child fork 1
parent fork 2
child fork 1
parent fork 2
parent fork 2
child fork 2
child fork 2
child fork 2
child fork 2
这里我就不明白了,为什么子进程没有执行printf("asfsda\n");而是从for开始执行呢?是fork函数对循环作特殊处理了吗?
你说exec后面都覆盖掉了,但是如上面的程序,如果没加exit,也没有exec函数,怎么printf("asfsda\n");在孙子进程中就没有执行呢?
能解答一下吗?
谢谢!! |
|