boost::process 如何知道进程何时退出 "gracefully or not"?
boost::process how to know when a process exited "gracefully or not"?
在等待 boost::process::child
时,如何知道它是否退出 "gracefully or not"?
假设我创建了一个进程:
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 应该 return 0 如果成功。
我看到如果有人在进程等待时终止进程(例如使用 child.terminate
或 Windows 进程管理器),child.exit_code()
将 return 1.
所以,最后,当child.exit_code()
为1时,我怎么知道这是进程主入口函数return的值,还是进程被杀死了呢?
是否保证 1 表示进程已被终止?那么程序不应该 return1 并保留这个退出码来识别它被杀死的具体情况,没有干净退出?
如果没有,boost::process
API 是否提供一些信息来了解进程是干净地结束还是被杀死?
So, in the end, when child.exit_code()
is 1, how can I know if this is the value returned by the process's main entry function or if the process was killed?
你不能。
Is it guaranteed that 1 will mean process was killed?
视情况而定。至于Windows,根据this的回答,应该是1,但是没有记载。请注意,终止进程的 return 代码由终止进程的实例确定。对于 Boost 的终止函数,可以在 detail/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_;
}
所以它总是 returning EXIT_FAILURE
,这可能是 1。但是,可以使进程 return 任何值。
为了区分您的进程是否以完全安全且可移植的方式正常终止,因此除了评估 return 代码之外,您还必须实施自己的通信机制。
您可以将子进程中的错误处理程序设置为 return 不同的退出代码。例如,从 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;
}
在等待 boost::process::child
时,如何知道它是否退出 "gracefully or not"?
假设我创建了一个进程:
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 应该 return 0 如果成功。
我看到如果有人在进程等待时终止进程(例如使用 child.terminate
或 Windows 进程管理器),child.exit_code()
将 return 1.
所以,最后,当child.exit_code()
为1时,我怎么知道这是进程主入口函数return的值,还是进程被杀死了呢?
是否保证 1 表示进程已被终止?那么程序不应该 return1 并保留这个退出码来识别它被杀死的具体情况,没有干净退出?
如果没有,boost::process
API 是否提供一些信息来了解进程是干净地结束还是被杀死?
So, in the end, when
child.exit_code()
is 1, how can I know if this is the value returned by the process's main entry function or if the process was killed?
你不能。
Is it guaranteed that 1 will mean process was killed?
视情况而定。至于Windows,根据this的回答,应该是1,但是没有记载。请注意,终止进程的 return 代码由终止进程的实例确定。对于 Boost 的终止函数,可以在 detail/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_; }
所以它总是 returning EXIT_FAILURE
,这可能是 1。但是,可以使进程 return 任何值。
为了区分您的进程是否以完全安全且可移植的方式正常终止,因此除了评估 return 代码之外,您还必须实施自己的通信机制。
您可以将子进程中的错误处理程序设置为 return 不同的退出代码。例如,从 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;
}