【问题标题】:Trying to create multiple processes in C++ using fork(); doesn't appear to be working尝试使用 fork() 在 C++ 中创建多个进程;似乎没有工作
【发布时间】:2019-03-14 19:24:12
【问题描述】:

我正在尝试使用 C++ 中的 fork() 创建具有多个子进程的父进程。我尝试使用this question 中的代码创建一个简单的程序,让每个进程向上计数;父母会打印“我是进程 0”,第一个孩子会打印“我是进程 1”,依此类推。

#include <unistd.h>
#include <stdio.h>
#include <fstream>
#include <sys/wait.h>
using namespace std;

const int PROCESSES = 5;
void Printer(int psno);
int iAmProcess = 0;

int main()
{

    int pids[PROCESSES];

    Printer(iAmProcess);

    for (int j = 0; j < PROCESSES; j++)
    {
        if (pids[j] = fork() < 0)
        {
            perror("Error in forking.\n");
            exit(EXIT_FAILURE);
        }
        else if (pids[j] == 0)
        {
            Printer(iAmProcess);
            exit(0);
        }
    }

    int status;
    int pid;
    int n = PROCESSES;
    while (n > 0)
    {
        pid= wait(&status);
        --n;
    }
    return 0;
}

void Printer(int psno)
{
    printf("I am process %d\n", psno);
}

而不是预期的输出:

I am process 0
I am process 1
I am process 2
I am process 3
I am process 4
I am process 5

我明白了:

I am process 0
I am process 0
I am process 0
I am process 0

然后程序终止。我做错了什么?

【问题讨论】:

  • 你在哪里将 IamProcess 更新为 != 0,我没看到
  • 我添加了一行“iAmProcess = j+1;”到for循环。但是,它现在只返回 4 次“I am process 1”而不是预期的输出。

标签: c++ fork


【解决方案1】:

我做错了什么?

你做错的一件事是在这一行:

    if (pids[j] = fork() < 0)

由于 C++ 中的操作顺序/优先级规则,该行被编译器解释为:

    if (pids[j] = (fork() < 0))

...也就是说,如果fork() 返回负值,则将pids[j] 设置为true(又名1),否则设置为false(又名0)。这可能不是你想要的。你想写的是:

    if ((pids[j] = fork()) < 0)

... 这样pids[j] 将被设置为fork() 的返回值,然后将测试该值是否小于零。 (在这种情况下,我总是使用显式括号,特别是因为我永远记不住运算符优先规则,而放置显式括号意味着我 [和代码的未来读者] 不必记住它们)

随着这一变化(以及您在评论中提到的 iAmProcess = j+1; 行添加到 for 循环的顶部——请随时编辑您的帖子以更新您的代码 sn-p,顺便说一句) ,我从你的程序中得到这个输出:

$ ./a.out
I am process 0
I am process 2
I am process 1
I am process 3
I am process 4
I am process 5

... 这不完全符合您的预期(输出的顺序不完全),但这是因为您生成的子进程彼此异步运行,并且不需要以任何特定的相对顺序执行彼此。

【讨论】:

  • 谢谢,就这样!它们是否按顺序执行并不重要(尽管当我运行它时,它们始终如此);我只是想制作一个具有多个并发进程的程序,并使用它来尝试弄清楚如何去做。
猜你喜欢
  • 1970-01-01
  • 2014-07-20
  • 2011-06-28
  • 2021-07-09
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多