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;
}