C

时间:2017-09-20 02:04:28

标签: c linux fork

所以我试图在我的书中解决有关C语言中的fork系统调用的问题。

以下是代码:

#include <stdio.h>
#include <unistd.h>

int main() {  

int i = 1;

   if (fork ()) //parent process will return PID of child.
        i++;
   else if (fork()) //child process (becomes parent)
            i--;
       else //grandchild process returns 0
            i++;

 printf("%d\n", i);
}

完成代码后,我得到了2 0 2作为解决方案。我很困惑,因为我不知道哪个顺序是正确的?子进程可以在父进程之前打印出来吗?如果是这样,另一个可行的解决方案可能是 0 2 2或2 2 0。我如何知道是否所有条件语句都将被执行?我知道在第一个条件中,if语句将被执行,并且将是父进程(它将返回子进程ID,并且i的值将增加到2)。如何知道else ifelse代码是否会被执行?对不起,我只是感到困惑,并试图解决这个问题,因为这对我来说是一个新主题。

非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

可以在父完成之前打印子进程。请记住,在父进程中,对fork()的调用返回非零数字,而在子进程中它将返回0.

#include <stdio.h>
#include <unistd.h>

int main() {  

int i = 1;

   if (fork ())
        i++;
   else if (fork())
            i--;
       else
            i++;

 printf("%d\n", i);
}

对于上面的代码,父代将执行第一个if()语句,子代将执行else if语句,孙代表将执行else语句。可以按任何顺序打印子/孙/父母。因此,2 0 2,2 2 0和0 2 2都是可行的解决方案。