我正在为类编写一个C ++程序,它需要一组N个子进程在基于Unix的系统上与其父进程通信。为此,在分叉过程之前,我声明了两个N管道阵列,每个管道对应一个通信方向:
int pipesToParent[N][2];
int pipesToChild[N][2];
... // for int i = 0 to N-1, pipe(pipesToParent[i]), pipe(pipesToChild[i]),
// fork(), yada yada, I included error checking and everything.
int pipesToChild[N][2];
父进程的大部分代码都在while循环中;在此循环开始附近,它会读取特定进程的消息:
read(pipesToParent[processToServe][READ_END], charArray, BUF_SIZE);
第一次进入循环,从进程X读取消息时,它工作正常。然后,它被指示对进程Y执行相同的操作,其中包含与进程X完全相同的数据类型的消息(我将每个进程cout其消息写入其管道时),并且该进程停止。它没有退出,只是在那条线上停留。我已经尝试了所有我能想到的东西来弄清楚我发送的消息可能有什么问题,但一切看起来都很好。这是怎么回事?
(对不起,如果我的细节不够;我无法弄清楚我还需要包含什么以及我可以删除什么来粘贴可以重现问题的东西。)
ETA:
子进程有自己的内部while循环,在其中从自己的管道中读取:
read(pipesToChild[thisProcessNumber][READ_END], charArray, BUF_SIZE);
如果父母已经准备就绪,它会发送消息:
write(pipesToParent[thisProcessNumber][WRITE_END], message, BUF_SIZE);
一些修补过程揭示了过程Y,就像父母一样,正好经历了这个循环,然后第二次陷入阅读。冲洗究竟会做什么,如果我以这种方式写入/读取管道,我能做到吗? (如果它是相关的,我已经#included cstdlib,但不是cstdio。)
答案 0 :(得分:1)
似乎对我来说是死锁 - 你的进程都在等待另一个进程 写点什么 - 但它们都没有写任何东西,所以一切都停止了。确保你的通信设计没有死锁(例如,客户端不断重复,只能在阅读READY comunicate时写入,服务器只能写入READ comunicate)。您也可以考虑使用非阻塞管道。
据我所知,使用pipe()调用创建的管道是无缓冲的 - 所涉及的唯一缓冲区是管道缓冲区,但由于这是完成目标应用程序读取的缓冲区,因此无法创建通信问题。仅当您将文件描述符映射到类似C的FILE指针时才会发生应用程序级别,但似乎并非如此。
如果您仍然认为一切正常,请发布显示此行为的最小可编译代码,以便我可以说更多。
编辑:
既然你接受了答案,如果你提到哪个解决方案(如果有的话)解决了你的问题,那将会很好。