【问题标题】:How can I create a new process for each element of a matrix?如何为矩阵的每个元素创建一个新过程?
【发布时间】:2021-03-31 15:45:25
【问题描述】:

我想创建一个矩阵,其中每个单元格都包含一个进程(稍后将执行一些必需的操作)。目前,我只想打印显示每个进程的 PID 的矩阵,但是使用 fork() 函数我不断得到一个无限循环。我可能不明白 fork 函数是如何工作的。任何人都可以向我解释它是如何工作的,甚至可以给我一些关于我刚刚介绍的案例的例子吗?提前致谢!

pid_t forking;
for (int i = 0; i < ROW; i++){
    for (int j = 0; j < COL; j++){
            forking = fork();
            exit(EXIT_SUCCESS);
    }
}

【问题讨论】:

  • 请展示你的代码,解释它试图做什么以及它有什么错误或不正确的行为。
  • 我只是猜测,但也许您让子进程在工作后继续?您必须记住在子进程完成处理后exit
  • @kaylum 我添加了代码,我只是因为缺少最重要的部分而遗漏了它,而且正如我在问题中解释的那样,我无法添加。
  • @Someprogrammerdude 如何在我的代码中添加出口?
  • 建议您阅读manual page 并查看链接示例。你所拥有的被称为“分叉炸弹”——每个子进程也在循环中调用fork。您需要在fork 调用之后添加代码,以分离出父进程的作用(继续fork 循环)和子进程应该做什么(例如打印一些东西)。

标签: c matrix process fork pid


【解决方案1】:

现在我们可以看到一些代码,我的猜测似乎是正确的。如果您似乎误解了fork 的工作原理...

如果成功,它实际上会返回两次! 一次在父进程中,一次在子进程中。在子进程中,您不应该继续循环,而是做一些“工作”然后exit。父进程应该继续循环以创建进程,然后在最终reap所有子进程之前进行自己的处理。

简而言之:

pid_t pid_matrix[ROW][COL];

for (size_t row = 0; row < ROW; ++row)
{
    for (size_t col = 0; col < COL; ++col)
    {
        pid_matrix[row][col] = fork();

        if (pid_matrix[row][col] == -1)
        {
            // Error! Handle it some nice way
        }
        else if (pid_matrix[row][col] == 0)
        {
            // In the child process...
            // TODO: Do some work here!
            printf("In a new child process with pid %d\n", getpid());

            exit(EXIT_SUCCESS);  // Terminate the child process

            // Note that because the child-process have now exited,
            // the loop will not continue
        }
        else
        {
            // In the parent process
            printf("Created a new process with pid %d\n", pid_matrix[row][col]);

            // Note that we don't exit or do anything special here
            // This will let the loops continue as normal
        }
    }
}

[如何收获(释放资源)子进程留给读者作为练习]

【讨论】:

  • 最后,父进程应该wait让子进程终止。
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多