c - C 中的 Fork() 程序

标签 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 代码是否会被执行?抱歉,我只是很困惑并试图解决这个问题,因为这对我来说是一个新主题。

如有任何帮助,我们将不胜感激。提前谢谢你。

最佳答案

子进程可以在父进程完成之前打印出来。请记住,在父进程中,对 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语句。 child /孙子/ parent 可以按任何顺序打印。因此,2 0 2、2 2 0 和 0 2 2 都是可行的解决方案。

关于c - C 中的 Fork() 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46312154/

相关文章:

linux - Collectd 无法读取 Ansible 发送的配置文件

c - forkall 没有按预期工作

c - 在任何平台上使用 ANSI C 保存和加载数据

可以将 int 值添加到 float 值吗?

linux - Linux 如何确定 ISO 9660 上的文件名大小写?

java - Tomcat 中的跨操作系统开发。 Linux 下antiJARLocking 和antiResourceLocking 可以设置为True 吗?

c - Socketpair 仅打印 stdin 中的第一行

c - C中的进程同步不会第一次执行

c++ - 宏定义 ARRAY_SIZE

c - 我分配内存错误吗?