gpt4 book ai didi

c - 在 C 中处理使用 fork() 创建的子进程

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:37 25 4
gpt4 key购买 nike

我的 C 作业程序将两个矩阵相乘。乘积矩阵的每个条目都由使用 fork() 创建的子进程计算。 child 计算这个并使用管道将数据发送给 parent 。因此,如果产品矩阵的大小为 10x10,我将创建 100 个子进程。工作正常。

然后我注意到对于非常大的矩阵,这是行不通的。做了一些检查后,我意识到这是因为它不会在一定数量后创建更多子进程(pid 返回负数)。比如,某种限制,这是有道理的。

确实,我不能指望我的计算机允许一个程序产生数千个子进程,所以显然我的程序不能乘以超大矩阵。好的。

然后我想到:好吧,我不需要立即所有子进程。我可以制作 100 个,让他们做他们的事情,然后创建下一个 100 个,依此类推,直到为我的矩阵乘积完成所有必要的计算。

我的程序本质上是一个迭代行*列次的循环。每次迭代,它都会生成一个子进程。所以我决定,对于每 100 次迭代,我将放置一个 sleep() 东西。我希望当 sleep() 完成时,之前的 100 个子进程会消失,“释放”下 100 个批处理所需的所有空间。 las,这并没有什么不同:程序的行为完全相同(当然,除了速度较慢)。

因此,考虑到 sleep() 没有起作用,我怀疑我没有正确地“杀死”子进程。子进程是这样​​死掉的:

// Close the pipe!
close(fd[0]);
close(fd[1]);
// Exit
exit(0);

父级读取数据后,也关闭管道:

read(fd[0], buffer, sizeof(buffer));
close(fd[0]);
close(fd[1]);

所以我的问题是:由于我已经创建了太多子进程,所以我无法创建新的子进程,看来我没有正确处理旧进程。我怎样才能正确处理它们?

最佳答案

什么 sleep(3)确实是让进程暂时休眠,但它仍然保持事件状态。

正如您所说,在创建更多子进程之前,您需要确保子进程已死。为此, children 需要 exit(2)当他们完成工作时正确,父进程应该使用 wait(2)在他们身上为了reap它们,并在进程表中腾出空间。

一个可能的解决方案是 fork(2)一些子进程完成部分工作,然后 wait(2)它们在 forking 更多它们来完成工作的其他部分之前完成。

关于c - 在 C 中处理使用 fork() 创建的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26824613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com