Boost.Process проверка, если процесс завершен

Можно ли проверить, завершен ли процесс?

Я не хочу звонить .wait(), потому что это блокирует, и я хочу управлять тайм-аутом, после которого я закончу процесс.

Теперь у меня есть следующий код:

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

но он не ожидает завершения и не проверяет, изящен ли процесс.

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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector