2016-02-12 2 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

как с помощью [async API] (http://www.highscore.de/boost/process0.5/boost_process/tutorial.html#boost_process.tutorial.waiting_for_a_program_to_exit) через boost :: asio? –

ответ

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.