(UNIX)fork()如何在循环中工作?

时间:2014-10-18 17:43:05

标签: linux loops unix if-statement fork

我有这个程序

childpid = 0;
int i, n;

for(i=1; i < n; i++)
    if((childpid = fork())
        break;
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n,
        i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;

它表示由于父进程的childpid变量的值不为0,因此它将跳出循环。子进程的pid为0,将在下一次迭代中成为父进程。

据我所知,在调用fork()行之后,使用代码创建了一个新进程。如果父进程由于其childpid不为0而突破循环,这是否意味着printf语句将运行一次并且程序将在循环结束后终止? 我很困惑这个程序是如何运行的。

我也有这段代码

for(i=1; i < n; i++)
    if( ((childpid = fork()) <= 0)
        break;
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n,
        i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;

这会创建一个流程的粉丝,并与第一个程序相反。子进程突然退出循环,因为它的chilpid等于0,并且父进程在循环中运行。

我星期一参加考试,而且我已经了解了其他一切 请帮忙:/

2 个答案:

答案 0 :(得分:1)

  

这是否意味着printf语句将运行一次,程序将在循环结束后终止?

是的,它会。但在此之前,它还没有产生儿童过程以继承其遗产。

这是一张糟糕的图表,显示了正在发生的事情。在代码片段#1中,进程自行分叉,父进程死亡,然后子进程继续运行。

在代码片段#2中,进程自行分析,子进程死亡,然后父进程继续运行。

在每种情况下,结果都是一长串的打印语句。

Crappy diagram showing process trees in each case

答案 1 :(得分:0)

我编辑了你的第一个代码,并在if语句的开头和结尾添加了“{}”和for循环:

**int main()
{
int childpid = 0;
int i, n;
n=5;
for(i=1; i < n; i++){
    if((childpid == fork()))
    {
        break;
    }
        fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n",
        i, (long)getpid(), (long)getppid(), (long)childpid);
    }
wait(0);
return 0;
}**

这就是结果:

i:1进程ID:3443父ID:2790子ID:0

i:2进程ID:3443父ID:2790子ID:0

i:3进程ID:3443父ID:2790子ID:0

i:4进程ID:3443父ID:2790子ID:0

主要进程(父进程)执行for循环中的所有打印,而每个子进程都在if语句之后退出。

在您的第二个代码上,而不是

  

if(((childpid = fork())&lt; = 0)           打破;

你可以写:

int f=fork();
if (f<0)
{
    perror("can't create child\n");
}

if(f==0)
{
    break;
}

因为如果 “f” 小于0,则表示该子项未成功创建,如果是,则会突然出现imediatley。