2016-02-12 193 views
1

是否可以检查进程是否终止?Boost.Process检查进程是否终止

我不想调用.wait(),因为它是阻塞的,我想管理超时,之后我将终止该过程。

现在我有以下代码:

child c = launch(exec, args, ctx); 
auto timeout = boost::posix_time::seconds(3); 
boost::this_thread::sleep(timeout); 
c.terminate(); 

,但它不会等待终止和不检查过程正常temrinated。

+0

如何通过boost :: asio使用[async API](http://www.highscore.de/boost/process0.5/boost_process/tutorial.html#boost_process.tutorial.waiting_for_a_program_to_exit)? –

回答

1

这不是在boost.process 0.5(它是0.6),所以你需要自己实现它。这可以这样做:

#if defined (BOOST_WINDOWS_API) 

template<typename Child> 
inline bool is_running(const Child &p, int & exit_code) 
{ 
    DWORD code; 
    //single value, not needed in the winapi. 
    if (!GetExitCodeProcess(p.proc_info.hProcess, &code)) 
     throw runtime_error("GetExitCodeProcess() failed"); 

    if (code == 259) //arbitrary windows constant 
     return true; 
    else 
    { 
     exit_code = code; 
     return false; 
    }  
} 

#elif defined(BOOST_POSIX_API) 

tempalte<typename Child> 
inline bool is_running(const Child&p, int & exit_code) 
{ 
    int status; 
    auto ret = ::waitpid(p.pid, &status, WNOHANG|WUNTRACED); 

    if (ret == -1) 
    { 
     if (errno != ECHILD) //because it no child is running, than this one isn't either, obviously. 
      throw std::runtime_error("is_running error"); 

     return false; 
    } 
    else if (ret == 0) 
     return true; 
    else //exited 
    { 
     if (WIFEXITED(status)) 
      exit_code = status; 
     return false; 
    } 
} 

#endif 

或者只是使用boost.process 0.6,如​​果你有C++ 11可用。