gpt4 book ai didi

c++ - 为什么我的程序在管道读取过程中卡住?

转载 作者:行者123 更新时间:2023-11-28 08:16:09 28 4
gpt4 key购买 nike

我正在为类编写一个 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);

如果 parent 准备好了,它会发送消息:

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

一些修补表明,进程 Y 与父进程非常相似,一次正常地经历此循环,然后第二次卡在读取上。冲洗究竟会做什么,如果我以这种方式写入管道/从管道读取,我可以这样做吗? (如果相关的话,我#included cstdlib,但没有 cstdio。)

最佳答案

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

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

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

编辑:

既然您接受了答案,那么如果您还提到哪个解决方案(如果有的话)解决了您的问题,那就太好了。

关于c++ - 为什么我的程序在管道读取过程中卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com