【问题标题】:Concurrent processes in CC中的并发进程
【发布时间】:2026-02-07 00:40:01
【问题描述】:

如何让 3 个进程并行运行?下面的解决方案是否正确? 在我的解决方案中,我放了一些代码来查看经过的时间,我认为这是在顺序模式下进行调整。我需要让pid1、pid2和pid3同时运行。

pid = fork();
if(pid == 0) {
        //code...
    exit(EXIT_SUCCESS);
} else if(pid > 0) {
        pid1 = fork();
        if(pid1 == 0) {
                //pid1 code...
            exit(EXIT_SUCCESS);
    } else if(pid1 > 0) {
            waitpid(pid1, &status, 0);
    } else {
        printf("Fork error %d.\n", errno);
    }

    pid2 = fork();
    if(pid2 == 0) {
                //pid2 code...
        exit(EXIT_SUCCESS);
    } else if(pid2 > 0) {
        waitpid(pid2, &status, 0);
    } else {
        printf("Fork error %d.\n", errno);
    }

    pid3 = fork();
    if(pid3 == 0) {
                //pid3 code...
                exit(EXIT_SUCCESS);
    } else if(pid3 > 0) {
        waitpid(pid3, &status, 0);
    } else {
            printf("Fork error %d.\n", errno);
    }
        waitpid(pid, &status, 0);
}

【问题讨论】:

  • 注意:可以创建的并发进程数与C语言无关。它由您的操作系统控制,在任何现代操作系统上,支持的并发进程数都在数千个。

标签: c fork


【解决方案1】:

在启动下一个子项之前,您一直在等待一个子项完成。尝试类似:

for (int i = 0; i < 3; ++i)
{
    pid = fork();

    if (pid < 0)
        error

    if (pid == 0)
    {
        child does thing
        exit
    }
}

for (int i = 0; i < 3; ++i)
{
    wait(&status);
}

编辑

因此,只需将您的代码更改为类似的内容,然后在最后等待。

    if (pid2 == 0)
    {
        //pid2 code...
        exit(EXIT_SUCCESS);
    }
    else
        if (pid2 < 0)
        {
            printf("Fork error %d.\n", errno);
        }

   //....same outline for 3, etc.

【讨论】:

  • 嗯,好的。但在那个解决方案中,我无法区分孩子的,对吧?我的意思是,我的 3 个进程必须执行不同的代码...在您的解决方案中,它们会执行相同的操作,对吗?
  • 可以,但您不必循环执行。您可以拥有三个独立的分叉,子分叉在每个分叉中执行不同的代码,但如果您希望它并行运行,则不要等待每个分叉完成后再继续在父分叉中运行。如果区分子 pid 很重要,请将它们放在数组或列表中,并在创建所有子进程后等待它们。
  • 现在我留在 shell 中的进程(我认为正在运行)。因为使用 wait() 它只等待一个进程,对吗?另一个留在那儿……
  • 我不确定我是否理解您的要求。这里不涉及外壳。孩子们将自己完成。操作系统将存储孩子的信息,直到您使用 wait() 收集它们。当它们完成时,您可以一个接一个地循环收集它们。所有的 wait() (通常)都是阻塞的,直到孩子完成,所以父母可以检查它的返回状态信息。
【解决方案2】:

查看我的wrap 程序,特别是wrapc 的代码。它分叉两次,将一个子进程执行到wrap,读取、写入wrap,然后在另一个子进程中回读。

【讨论】:

    【解决方案3】:

    您的问题有些模糊——您是否看到 3 个进程并行运行? 您的代码编写方式会立即退出子进程。

    【讨论】: