2011-10-12 56 views
0

我正在为需要一组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)

+0

要么你没有正确设置你的管道,进程Y实际上没有写入数据,或者你有[死锁](http://en.wikipedia.org/wiki/Deadlock),或者其他事情是错误的。没有更多的代码很难知道。 –

+0

这可能是由于某种原因Y没有写入消息给管道的过程。从管道读取的进程将阻塞,同时等待数据显示在管道中。我会确保Y真的写信给管道。 – BHS

+1

从手册页,“请注意输出popen()流默认情况下是完全缓冲的。”写完后你会()吗? –

回答

1

好像僵局我 - 无论你的进程等待一个又一个 写的东西 - 但没有人真正写什么,所以一切停止。确保你的通信设计是无死锁的(例如,客户一直在阅读READY通信,并且只能在阅读READY通信时阅读)。你也可以考虑去非阻塞管道。

据我所知,使用pipe()调用创建的管道是无缓冲的 - 所涉及的唯一缓冲区是管道缓冲区,但由于这是从目标应用程序中读取的同一缓冲区,因此无法创建通信问题。应用程序级别仅在将文件描述符映射到类似C的FILE指针时才会发生,但似乎并非如此。

如果您仍然认为一切正常,请发布可显示此行为的最小可编译代码,以便我可以多说一些。

编辑:

既然你接受了答案,它会如果你还提到其解决方案(如果有的话)来解决你的问题很好。

+0

对不起,我迟迟没有回应。原来,我正在阅读一个ifstream,在某个地方搞砸了其他的东西。我发现了一种不同的方式来检查程序在那个时候正在做什么,并解决了问题。 (对不起,如果这是令人困惑。-_-) –

相关问题