boost::process::child 在关闭输入流后不会退出

tsn*_*rri 4 c++ boost boost-process

在以下示例中,我尝试将一些数据写入子进程,该子进程处理数据并将其写入文件。关闭流后,父进程无限期地等待子进程完成。我不知道如何表明我已经完成了数据的写入,并希望子进程停止读取并完成它正在做的任何事情。根据文档调用 terminate会发送一个SIGKILL我认为不是我想要的。

我错过了什么?我检查了这个问题,但我宁愿先尝试使实际代码与同步 IO 一起工作。

#include <boost/process.hpp>
#include <iostream>


namespace bp = boost::process;


int main(int argc, char **argv)
{
    boost::process::opstream in{};
    boost::process::child child("/path/to/test.py", bp::std_in < in);

    in << "test1\n";
    in << "test2\n";
    in << "test3\n";
    in << std::flush;

    std::cerr << "Closing the stream…\n";
    in.close();
    std::cerr << "Waiting for the child to exit…\n";
    child.wait(); // Parent seems to hang here.

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test.py 只是将数据写入文件,如下所示:

#!/usr/local/homebrew/opt/python@3.8/bin/python3

import sys

with open("/tmp/test.txt", "w") as f:
    for line in sys.stdin:
        f.write(line)
Run Code Online (Sandbox Code Playgroud)

tsn*_*rri 5

检查源代码后,我发现关闭流并没有关闭关联的管道,至少在这种情况下是这样。手动执行此操作确实解决了问题:

...
in.close();
in.pipe().close();
child.wait(); // Does not hang.
Run Code Online (Sandbox Code Playgroud)