在等待boost::process::child
时,你怎么知道它是否已经退出"优雅与否#34;
我们说我创建了一个进程:
boost::process::child child( "myprg.exe", "5000" );
child.wait();
int res = child.exit_code();
myprg.exe位于:
int main( int argc, char* argv[] )
{
if ( argc == 2 )
{
boost::this_thread::sleep( boost::posix_time::milliseconds( atoi( argv[1] ) ) );
return 1;
}
return 0;
}
注意:这是一个毫无意义的MCVE,我同意main如果成功则应该返回0。
我看到如果有人在等待时终止进程(例如使用child.terminate
或Windows进程管理器),child.exit_code()
将返回1.
因此,最后,当child.exit_code()
为1时,如何知道这是进程的主要入口函数返回的值,还是该进程被终止?
是否保证1意味着进程被杀?然后程序不应该返回1并保留此退出代码以识别它被杀死的特定情况并且没有干净地退出?
如果没有,boost::process
API是否提供了一些知道过程是否干净地结束或被杀死的事情?
答案 0 :(得分:2)
因此,最后,当
child.exit_code()
为1时,如何知道这是进程的主要入口函数返回的值,还是该进程被终止?
你不能。
是否保证1意味着进程被杀?
这取决于。至于Windows,根据this回答,它将是1,但它没有记录在案。请注意,终止进程的返回代码由终止进程的实例确定。对于Boost的终止函数,可以找到详细信息/ windows / terminate.hpp:
inline void terminate(child_handle &p) { if (!::boost::winapi::TerminateProcess(p.process_handle(), EXIT_FAILURE)) boost::process::detail::throw_last_error("TerminateProcess() failed"); ::boost::winapi::CloseHandle(p.proc_info.hProcess); p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; }
所以它始终返回EXIT_FAILURE
,可能是1.但是,可以使进程返回任何值。
为了区分您的流程是否以完全万无一失的方式优雅地终止,您必须实现自己的通信机制,而不仅仅是评估返回代码。
答案 1 :(得分:0)
您可以在子进程中设置错误处理程序以返回不同的退出代码。例如,从STL库中添加std::set_terminate:
int main( int argc, char* argv[] )
{
std::set_terminate([](){ exit(2); });
if ( argc == 2 )
{
boost::this_thread::sleep(boost::posix_time::milliseconds(atoi(argv[1])));
return 1;
}
return 0;
}