【问题标题】:Spawning C child process for different jobs?为不同的工作产生C子进程?
【发布时间】:2014-09-08 14:06:39
【问题描述】:

所以我正在尝试做一个fork()s 2 个孩子的应用程序。

  • 首先执行for(i=1; i<=50000; i++) 循环
  • 第二个for(i=50000; i<=100000; i++)循环
  • 父级执行 for(asciic=65; asciic<=90; asciic++)-> 循环以打印 A 到 Z 字母

我需要三个人同时工作,而不是一个接一个。

我查看了互联网,但找不到合适的方法,我能找到的只是创建子进程的循环,但它们做的事情几乎相同,而且大多数都是一个接一个地创建的。

感谢任何帮助。

为了更好地理解,这是我在发布之前所做的:

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

int main(void) {
    pid_t child_pid,child_pid1;
    int i=0;
    int stare;
    int asciic;

    child_pid=fork();
    child_pid1=fork();

    if (child_pid==0) {
        //printf("Father PID: %d -> Child 1: %d\n",getppid(),getpid());
        for(i=1; i<=50000; i++){
            printf("%d-%d\n",getpid(),i);
        }
        exit(0);
    } else if (child_pid1==0) {
        //printf("Father PID: %d -> Child 2: %d\n",getppid(),getpid());
        for(i=50000; i<=100000; i++) {
            printf("%d-%d\n",getpid(),i);
        }
        exit(0);
    } else {
        //printf("PID-ul procesului parinte: %d\n", getpid());
        pid_t rez=waitpid(child_pid,&stare,WNOHANG);
        pid_t rez1=waitpid(child_pid1,&stare,WNOHANG);
        while(rez==0 || rez1==0){
            for(asciic=65; asciic<=90; asciic++){
                printf("%d- %c\n",getpid(),asciic);
            }
            rez=waitpid(child_pid,&stare,WNOHANG);
            rez1=waitpid(child_pid1,&stare,WNOHANG);
        }

    }

    return 0;
}

如果我注释掉循环,我可以看到孩子有不同的 PID,1 个孩子有正确的父 PID,其他的有其他父 PID。

【问题讨论】:

标签: c linux fork


【解决方案1】:

你的 2 行带叉子:

child_pid=fork();
child_pid1=fork();

不要创建两个孩子,而是三个:父母在第一个fork()中创建第一个孩子。从那一刻起,有两个进程:父进程和子进程。他们每个人都执行第二个fork()。您将总共有 1 位父母、2 位孩子和 1 位孙子女。

为了只有 1 个父母和 2 个孩子,您必须:

pid1 = fork();
if (pid1 < 0) {
    /* Error in fork() */
} else if (pid1 == 0) {
    /* first child */
    exit(0);
}

pid2 = fork();
if (pid2 < 0) {
    /* Error in fork() */
} else if (pid2 == 0) {
    /* second child */
    exit(0);
}

/* parent */

此外,即使您的代码是正确的,您也无法“看到”进程是同时运行还是仅仅查看它们的输出。事实上,即使有多个进程“同时”执行,您也可能会看到其中一个进程在另一个进程开始之前完成。那是因为内核通常会进行时间多路复用,以便为每个孩子提供一些 CPU 时间。如果进程需要更长的时间才能完成,您可以看到并发性,例如添加一些 sleep()

【讨论】:

    【解决方案2】:

    问题出在这里:

    child_pid=fork();
    child_pid1=fork();   // This line will be executed by both parent and first child!!!
    

    您需要将第二个 fork 移动到第一个 if 的父部分,然后为第二个子设置一个单独的 if。

    【讨论】:

    • 谢谢。你的答案就是我要找的那个。
    【解决方案3】:

    fork() 将子级的pid_t 返回给调用者(父级),如果失败则返回 -1。在孩子中,返回 0。你可以简单地测试

    if (fork())
        {
            //do one thing
        }
    else
        {
            //do something else
        }
    

    【讨论】:

    • @sjnarv 是的。我真的不知道当 fork() 失败时 OP 想要做什么。
    • 很抱歉,但我无法证明您的问题,因为我没有找到我正在寻找的内容,您只需向我展示用于创建 1 个孩子的进程的代码。我知道该怎么做,我也知道如何创建无限数量的孩子,但我不知道如何让多个孩子并行完成完全不同的工作(孩子在与父母 getpid 具有相同 getppid() 的进程中) ())。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2015-07-22
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多