为什么我的程序在管道读取过程中冻结?
Why does my program freeze in the middle of a pipe read?
我正在为一个类编写一个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指针时,应用程序级才会发生这种情况,但情况似乎并非如此。
如果你仍然认为一切都很好,发布显示这种行为的最小可编译代码,这样我也许可以说更多。
编辑:既然你已经接受了答案,如果你也能提到解决你问题的方法(如果有的话),那就太好了。
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- clang 插件:在编译过程中修改 AST
- 如何防止 std::thread 在 QT 中冻结 GUI?
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- 程序在对mouse_event的 Windows API 调用中冻结
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 在调用过程中删除 std::函数
- 动态矩阵特征分解过程中的误差
- cmake在构建过程中使用另一个工具检测标志
- 在模板参数推导过程中丢失限定符
- 升压过程中的管道缓冲区大小
- 如何在插入过程中更改插入的值
- 在PostgreSQL函数或过程中使用C++代码
- Vulkan:设备在缓冲区复制过程中丢失
- 如何解决导入dll过程中Viual Studio中的并排配置错误
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- 为什么我的程序在管道读取过程中冻结?