我正在尝试使用C语言中的管道和分支编写程序。我对如何实现这一点感到困惑。
我需要根据用户指定的输入创建n个进程(也就是说,如果用户输入2,我将通过fork创建2个进程)。然后,通过fork创建的每个新进程都会做一些事情。
然而,现在管道出现了。我有管道从每个叉子获取信息。我的问题是 - 如何为每个叉子创建多个管道?如果我有多个叉子,如何从父母的角度处理多个管道?
此外,假设我在父进程中有一个字符指针数组,当一个新进程通过fork生成时,这个进程可以访问该数组,还是不存在?
谢谢!
答案 0 :(得分:3)
使用pipe(),无需处理任何文件系统命名。
您可以在Linux中找到{(3}}的管道()示例,但对于任何* nix,它应该几乎相同。
基本上,您使用pipe()创建一对连接的fd。然后fork()和继承管道对的fork之后的每个进程关闭管道的一个(未被引入的)侧。您现在已连接两个进程,每个进程都有一个管道(剩余的fd)。
如果你以后必须处理很多这些问题,那么父母"主人"进程应该使用像select()或poll()这样的东西,并等待任何孩子有数据可用(意味着孩子写了一些东西)。还有http://man7.org/linux/man-pages/man2/pipe.2.html。
还要记住管道是单向的:如果需要在fork()之后向子节点发送数据,则应创建两个管道对。您也可以更改工具并使用socketpair():相同的一般用法,但语义更接近网络使用,并且它是双向的。
没有看到关于数组的最后一部分。正如另一个答案所说,分叉进程将拥有该数组的副本。如果它用来传递数据告诉做什么工作没问题,但是如果父进程必须在fork()之后给出更多信息,那么这个数组就不再是父数据了。
如果您确实需要在fork()之后在父级和子级之间传递大量数据,您还可以使用一些共享内存机制。这里用mmap()示例: select() example
答案 1 :(得分:1)
实际上,使用管道只是在进程之间交换数据的众多方法之一。我说进程,因为fork()
是一个系统调用,"分裂"您当前流程的新流程。称这个新流程为#fork;#34;因此对我来说有点混乱。
如何创建管道将取决于您的操作系统,但在unixoids / POSIX上,请参阅man 3 mkfifo
有关如何创建命名管道的信息。然后,您可以打开,读取和写入,例如,一个角色设备,基本上。
请注意,使用fifos与多个进程通信(例如在您的问题语句中)可能效率特别低 - FIFO上的读/写调用会阻塞,直到两端都打开文件,因此,启动时可能会有点复杂。
对于进程之间的这种通信,其他IPC(进程间通信)机制更适合 - 例如,System-V IPC(请参阅man ipc
),或套接字,或者诸如zeroMQ之类的东西。< / p>
我认为你可能正在阅读八十年代的书籍/教程 - 在现代机器和操作系统上学习多处理时,这可能不是最好的事情。
此外,假设我在父进程中有一个字符指针数组,当一个新进程通过fork生成时,这个进程可以访问该数组,还是不存在?
阅读fork()
的文档。子进程是fork
时父进程(除PID之外)的完全副本。因此,是的,您的分叉进程将具有相同数据的副本。
请注意您如何滥用&#34;访问&#34;。您的女儿处理无法访问父流程的任何数据 - 这是流程细分的全部要点;流程无法读取或写入其他流程&#39;存储器中。
如果您误以为分叉流程可以访问父流程的数据,那么必须重新访问您的多学科学习基础的材料。