使用C中的fork()创建子进程

使用C中的fork()创建子进程,c,linux,process,fork,C,Linux,Process,Fork,我的C作业程序将两个矩阵相乘。产品矩阵的每个条目都由使用fork()创建的子进程计算。子对象计算此值,并使用管道将数据发送给父对象。因此,如果产品矩阵的大小为10x10,我将创建100个子流程。很好 然后我注意到,对于非常大的矩阵,这是不起作用的。在做了一些检查之后,我意识到这是因为在一个特定的数字之后,它不会创建更多的子进程(pid返回负值)。比如,某种限制,这是有道理的 事实上,我不能期望我的计算机允许一个程序产生几千个子进程,所以很明显我的程序不能乘以超大矩阵。好的 然后我突然想到:好吧,

我的C作业程序将两个矩阵相乘。产品矩阵的每个条目都由使用
fork()
创建的子进程计算。子对象计算此值,并使用管道将数据发送给父对象。因此,如果产品矩阵的大小为10x10,我将创建100个子流程。很好

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

事实上,我不能期望我的计算机允许一个程序产生几千个子进程,所以很明显我的程序不能乘以超大矩阵。好的

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

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

因此,考虑到
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]);

所以我的问题是:因为我已经创建了太多的子进程,所以我无法创建新的子进程,所以我似乎没有正确地处理旧进程。如何正确处理它们?

所做的是使进程暂时休眠,但仍能使其保持活动状态

正如您所说的,您需要确保在创建更多子进程之前子进程已停止。要做到这一点,子进程需要在完成其工作时正确执行,并且父进程应该对它们使用,以便对它们进行排序,并在进程表中留出空间


一个可能的解决方案是让一些子进程完成工作的某一部分,然后让他们在“叉”之前完成“叉”让他们中的更多人做其他部分的工作。

看看“等待”,它让你最终知道一个给定的子进程已经完成。但是你难道不知道这个子进程是在从管道中读取时完成的吗?@ChiefTwoPencils是的,对吗?所以
sleep()
(或者什么都没有)应该没问题!我认为,分叉数百个进程是很慢的。使用线程要好得多。这样,您就不必处理管道和子进程了,这一点无法保证<代码>睡眠(1)是一个坏控制器。最好使用管道本身作为指示器,因为它是阻塞调用,可能是信号。您也可以使用
等待
。你可以在(1)等待
SIGCHLD
时,阅读管道,呼叫wait,
在必要时杀死孩子。事实上,
wait
waitpid
是在孩子之后清理的方法,为更多的孩子腾出空间+1.