C中的管道和叉子

我试图在C中使用管道和叉子编写程序。我对如何实现这一点感到有点困惑。

我需要根据用户指定的输入创建n个进程(也就是说,如果用户输入2,我将通过fork创建2个进程)。 然后,通过fork创建的每个新进程都会执行一些操作。

然而,现在管道出现了。 我有管道从每个叉子获取信息。 我的问题是 – 如何为每个叉子创建多个管道? 如果我有多个叉子,我怎样才能从父母角度处理多个管道?

此外,假设我在父进程中有一个字符指针数组,当一个新进程通过fork生成时,这个进程可以访问该数组,还是不存在?

谢谢!

使用pipe(),无需处理任何文件系统命名。

您可以在http://man7.org/linux/man-pages/man2/pipe.2.html上找到适用于Linux的pipe()示例,但对于任何* nix,它应该几乎相同。

基本上,您使用pipe()创建一对连接的fd。 然后fork()和inheritance管道对的fork之后的每个进程关闭管道的一个(不需要的)一侧。 您现在已连接两个进程,每个进程都有一个管道(剩余的fd)。

如果你以后必须处理很多这些,那么父“master”进程应该使用像select()或poll()这样的东西,并等待任何孩子有数据可用(意味着孩子写了一些东西)。 还有一个select()示例 。

还要记住管道是单向的:如果需要在fork()之后向子节点发送数据,则应创建两个管道对。 您还可以更改工具并使用socketpair():相同的一般用法,但语义更接近网络使用,并且它是双向的。

没看到关于数组的最后一部分。 正如另一个答案所说,分叉进程将拥有该数组的副本。 如果它用于传递数据告诉做什么工作就没问题,但是如果父进程必须在fork()之后给出更多的信息,那么这个数组就不再是父数据了。

如果你真的需要在fork()之后在父和子之间传递大量数据,你也可以使用一些共享内存机制。 这里用mmap()示例: 如何在进程fork()之间共享内存?

实际上,使用管道只是在进程之间交换数据的众多方法之一。 我说进程,因为fork()是一个系统调用,它“分离”当前进程的新进程。 因此,对我而言,将新流程称为“分支”对我来说有点混乱。

如何创建管道将取决于您的操作系统,但在unixoids / POSIX上,请参阅man 3 mkfifo ,了解如何创建命名管道。 然后,您可以打开,读取和写入,就像对象,例如一个字符设备。

请注意,使用fifos与多个进程通信(如在您的问题语句中) 可能效率特别低 – FIFO上的读/写调用会阻塞,直到两端都打开文件,因此启动时可能会有些复杂。

对于进程之间的这种通信,其他IPC(进程间通信)机制更适合 – 例如,System-V IPC(参见man ipc ),或套接字,或者诸如zeroMQ之类的东西。

我想你可能正在阅读八十年代的书籍/教程 – 在现代机器和操作系统上学习多处理时,这可能不是最好的开始。

此外,假设我在父进程中有一个字符指针数组,当一个新进程通过fork生成时,这个进程可以访问该数组,还是不存在?

阅读fork()的文档。 fork时,子进程是父进程(除PID之外)的精确副本。 因此,是的,您的分叉进程将拥有相同数据的副本

注意你如何滥用“访问”。 您的子进程无法访问父进程的任何数据 – 这是进程分段的全部要点; 进程无法读取或写入其他进程的内存。

如果您误认为分叉进程可以访问父进程的数据,那么您必须重新访问基于多学科学习的材料。