为什么我的程序在管道读取过程中冻结?

Why does my program freeze in the middle of a pipe read?

本文关键字:过程中 冻结 读取 管道 我的 程序 为什么      更新时间:2023-10-16

我正在为一个类编写一个c++程序,它需要一组N个子进程来与基于unix的系统上的父进程通信。为此,在fork进程之前,我声明了两个包含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完全相同的数据类型(我让每个进程在将消息写入其管道时计算其消息),然后进程停止。它不会退出,只是停留在那条线上。我已经尝试了我能想到的所有方法来找出我发出的信息可能有什么问题,但看起来一切都很好。这是怎么回事?

(抱歉,如果我的细节不够;我不知道我还需要包括什么,以及我可以删除什么来粘贴会重现问题的内容。

埃塔:

子进程有自己的内部while循环,它从自己的管道中读取数据:

read(pipesToChild[thisProcessNumber][READ_END], charArray, BUF_SIZE);

如果父节点准备好了,它会发送消息:

write(pipesToParent[thisProcessNumber][WRITE_END], message, BUF_SIZE);

一些修补已经揭示了进程Y,非常像父进程,一次通过这个循环,然后在第二次读取时卡住。冲洗到底会做什么,如果我以这种方式写入/读取管道,我能做到吗?(如果它是相关的,我已经#包括cstdlib,但不包括cstdio。)

对我来说似乎是死锁-您的两个进程都在等待另一个进程写点什么——但他们都没写什么,所以一切都停止了。确保你的沟通设计是无死锁的(例如:客户端持续读,读READY通信时才写,服务器端写READ通信后才读)。你也可以考虑使用非阻塞管道。

据我所知,使用pipe()调用创建的管道是未缓冲的-唯一涉及的缓冲区是管道缓冲区,但由于这是在目标应用程序中完成读取的相同缓冲区,因此它不会产生通信问题。只有当你将文件描述符映射到类似c语言的file指针时,应用程序级才会发生这种情况,但情况似乎并非如此。

如果你仍然认为一切都很好,发布显示这种行为的最小可编译代码,这样我也许可以说更多。

编辑:

既然你已经接受了答案,如果你也能提到解决你问题的方法(如果有的话),那就太好了。