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
相关产品推荐
相关产品推荐

