How to ensure that we read all lines from boost::child process

Viewed 4317

I saw the following code on boost::child documentation page where they explain how to read the output of a child process. http://www.boost.org/doc/libs/1_64_0/doc/html/boost_process/tutorial.html They say after running your child process, we can read it via this loop:-

bp::ipstream is; //reading pipe-stream
bp::child c(bp::search_patk("nm"), file, bp::std_out > is);

//then later
while (c.running() && std::getline(is, line) && !line.empty())
        data.push_back(line);

I have 2 questions here :-

  1. If c.running() returns false, we simply exit the loop. And in that case, the stream is above may still carry data which gets lost ?
  2. What is the best way to read stdout and stderr both, while making sure the process exit() doesn't create a deadlock There is a warning on the page saying :-
    The pipe will cause a deadlock if you try to read after nm exited

I wish to capture both stdout and stderr without having to worry about nm has exited or not above.

3 Answers

Another solution.

bp::child c(bp::search_path("nm"), file, bp::std_out > output, bp::std_err > error, svc);

This code ignores the order of stdout/stderr. If the order concerns, you can write like this:

bp::child c(bp::search_path("nm"), file, (bp::std_out & bp::std_err) > outerr, svc);
Related