如何为矩阵的每个元素创建新流程?

问题描述 投票:0回答:1

如何使用 fork() 函数创建一个包含进程的矩阵,每个进程都包含一个唯一的进程 ID (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);
    }
}
c matrix process fork pid
1个回答
2
投票

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

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
        }
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.