我正在为需要一组N个子进程与基于Unix系统上的父进程进行通信的类编写C++程序。为此,我声明Ñ管,一个用于每个通信方向的两个阵列分叉的处理之前:为什么我的程序在读取管道的过程中冻结?
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完全相同的数据类型(每个进程在将消息写入其管道时都会收到消息),并且进程停止。它不会退出,它只是在那条线上冻结。我尝试了所有我能想到的方法来弄清楚我发送的信息可能有什么问题,但这一切看起来都很好。这里发生了什么?
(很抱歉,如果我的细节的不足,我想不出还有什么我必须包括什么,我可以删除贴的东西会重现该问题。)
ETA:
子进程有其自己的内部while循环中,它从自己的管道上写着:
read(pipesToChild[thisProcessNumber][READ_END], charArray, BUF_SIZE);
如果父母的准备,它会发送其消息:
write(pipesToParent[thisProcessNumber][WRITE_END], message, BUF_SIZE);
有些修补程序已经显示进程Y很像父进程一次通过这个循环,然后第二次卡住读取。如果我以这种方式写入/读取管道,冲洗会做什么,我可以这样做吗? (如果是相关的,我已经执行#included cstdlib,但不cstdio)
要么你没有正确设置你的管道,进程Y实际上没有写入数据,或者你有[死锁](http://en.wikipedia.org/wiki/Deadlock),或者其他事情是错误的。没有更多的代码很难知道。 –
这可能是由于某种原因Y没有写入消息给管道的过程。从管道读取的进程将阻塞,同时等待数据显示在管道中。我会确保Y真的写信给管道。 – BHS
从手册页,“请注意输出popen()流默认情况下是完全缓冲的。”写完后你会()吗? –