boost :: process如何知道流程什么时候退出"优雅与否#34;?

时间:2017-12-04 08:59:44

标签: c++ boost boost-process

在等待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是否提供了一些知道过程是否干净地结束或被杀死的事情?

2 个答案:

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