解释为什么fork导致IF条件表现不同。

时间:2014-06-03 12:25:52

标签: c if-statement fork conditional-statements

我通过搜索找到了这个样本。 乍一看,我认为只有第一个fork()会根据IF条件执行,但实际上两个fork()调用都会被执行。 如果fork()命令更改为简单的布尔比较(如(x == 10)),则IF条件的行为与预期的一样。

fork()导致IF条件表现不同的原因是什么?

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pid_t whichone, first, second;
int howmany;
int status;
int x = 0

if ((first=fork())==0) /* Parent spawns 1st child */
{
    printf("Hiya, I am the first child nd my id is %d\n", getpid());
    sleep(10); 
    exit(0);   
}
else if (first == -1)
{
    perror("1st fork: something went bananas\n");
    exit(1);
}
else if ((second=fork())==0) /* Parent spawns 2nd  child */
{
    printf("Hiya, I am the second child and my id is %d\n", getpid());
    sleep(15); /* Sleep 15 sec, then exit */
    exit(0);   
}
else if (second == -1)
{
    perror("2nd fork: something went bananas\n");
    exit(1);
}

printf("This is the parent\n");

howmany=0; 
while (howmany < 2) /* Wait twice */
{
    whichone=wait(&status);
    howmany++;

    if (whichone==first)
       printf("First child exited ");
    else
       printf("Second child exited ");

    if ((status & 0xffff)==0)
       printf("correctly\n");
    else
       printf("uncorrectly\n");
}
return 0;

这是执行时的输出。请注意,两个fork()调用都已处理。

> runtThis
Hiya, I am the first child, and my id is 31204
Hiya, I am the second child, and my id is 31205
This is the parent
First child exited correctly
Second child exited correctly

2 个答案:

答案 0 :(得分:0)

第一个if检测它是否在孩子中运行。如果它不是,但fork()没有失败(即,它没有返回-1),它在原始过程中,然后可以继续并调用再次fork()

不确定是什么混淆。

答案 1 :(得分:0)

fork()函数复制当前进程,然后在两个进程中返回 。因此,有效地,fork()函数返回两次。

在新流程中,fork()返回值0,这会导致相关分支打印&#34;我是孩子&#34;被采取 在原始过程中,fork()返回非零值,表示失败(如果为负)或新进程的进程ID(如果为正)。由于此值不为零,因此跳转到下一个else if并执行该测试,直到成功为止。

在父进程中,if / else if测试都不会成功,但每个fork调用都会导致创建一个新进程,相应的测试成功并且这会产生你注意到的效果。