You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pipe/dup2/exec*中的竞态条件问题排查

管道链式执行中的SIGPIPE与阻塞问题

我正在开发一个个人项目,核心功能之一是执行指定程序并处理其输入输出。查阅大量同类问题后仍遇到瓶颈:当链式执行超过2个程序(如exec >> exec2 >> exec3)时,怀疑stdout向后续程序stdin管道传输存在竞态条件(Race condition)。

链式执行时会创建std::thread调用Executable::consume_and_forward函数,读取前序程序stdout直到EOF后写入后续程序stdin。编写的测试用例中前三个正常,第四个触发SIGPIPE终止程序,即使write前已做poll操作。

编辑1:sed可被execvp正常执行但快速退出,后续写入时触发SIGPIPE,且管道仍被报告为POLLOUT状态。
编辑2:修复sed问题后,consume_and_forward读取第一个命令输出时出现阻塞,仅注释test4中sed相关代码即可正常运行。

当前测试输出:

Test 1: OK
Test 2: OK
Test 3: OK
Test 4: (SIGPIPE and aborts)

补充:取消main中忽略SIGPIPE的注释后程序不终止但测试仍失败,这并非可行方案。为何使用poll仍无法避免向已关闭管道写入?

附带相关代码文件:main.cxx、pipe.hxx、pipe.cxx、executable.hxx、executable.cxx。


内容的提问来源于stack exchange,提问作者StormByte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:52:12