In the stdio.cpp example there is the following assertion: assert(!ec || (ec == asio::error::eof)); after reading from the pipe. On Windows it would fire because ec would be asio::error::broken_pipe. As far as I understand, if the process ended the writing part of the pipe has been closed so the error won't be eof. See MSDN and also an ASIO issue.