无法从 2 个 forks() 获取 3 个子进程

Posted

技术标签:

【中文标题】无法从 2 个 forks() 获取 3 个子进程【英文标题】:Unable to get 3 child processes from 2 forks() 【发布时间】:2021-11-28 13:27:54 【问题描述】:

我刚刚进入 C,目前,我正在尝试编写使用 2 forks() 的结果,它应该给我 4 个进程,其中 3 个是子进程。

在下面的代码中,我只有大约 2 个得到 2 个子进程,而不是预期的 3 个。我读到进程数由 2^n 和减 1 来确定子进程?

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>


int main()

    pid_t pid;
    pid = fork(); // fork #1
    pid = fork(); // fork #2

    if (pid==0)
    
        printf("Child process.\n");
        printf("  |-- Child PID: %d\n", getpid());
        printf("  |-- Parent PID: %d\n", getppid());
    
    else if (pid > 0)
    
        printf("Parent process\n");
        printf("  |-- Parent PID: %d\n", getpid());
        printf("  |-- Child PID: %d\n", pid);

        printf("\tWait till the child process is finished...\n");
        sleep(100);
        printf("\tChild process is now finished.\n");
        
    
    else
    
        printf("Fork return error code. No child process.\n");
    

    return 0;

以下是根据我写的代码输出的结果:

Parent process
    |-- Parent PID: 3201
    |-- Child PID: 3203
        Wait till the child process is finished...
Child process
    |-- Child PID: 3203
    |-- Parent PID: 3201
Parent process
    |-- Parent PID: 3202
    |-- Child PID: 3204
        Wait till the child process is finished...
Child process
    |-- Child PID: 3203
    |-- Parent PID: 3201
            Child process is now finished.
            Child process is now finished.

我是否可能遗漏了一些可能导致缺少子进程的内容?

【问题讨论】:

你的一个“父进程”是另一个的子进程,你只是不打印这个事实。 @user253751 能否麻烦您与我分享更多关于这方面的见解?我真的看不出我的代码中的哪一行对此做出了贡献 当您调用pid = fork(); 两次时,您也意识到您正在覆盖pid 的存储值。 @dissidia 关于@user253751 的声明,当您调用产生子进程的pid = fork() 时。然后你有2个进程。然后这两个进程都调用pid = fork(),这意味着原来的父母现在有两个孩子,第一个孩子现在有一个孩子。 这两个进程都将来自第二个分叉的关系存储在pid 中,并忘记他们是第一个分叉的第一个还是第二个孩子 【参考方案1】:

在推断发生了什么之前,您正在覆盖pid

pid_t pid;
pid = fork(); // fork #1
pid = fork(); // fork #2

if (pid==0) ...

而是在每个fork() 之后检查pid

pid_t pid;
int tag = 0;

pid = fork(); // fork #1
if (pid==0) tag = 2;
pid = fork(); // fork #2
if (pid==0) ++tag;

printf("tag: %d\n", tag);

Try it online!

【讨论】:

以上是关于无法从 2 个 forks() 获取 3 个子进程的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 并行和异步

父进程无法读取来自 C 中 4 个不同管道的所有消息

进程分配

linux c之通过管道实现兄弟间进程通信:

unix 管道是不是仅限于在 2 个进程之间使用?

1个子表单从多个父表单获取属性