99 lines
3.1 KiB
C++
99 lines
3.1 KiB
C++
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
|
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
|
// Copyright (c) 2009 Boris Schaeling
|
|
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
|
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#ifndef BOOST_PROCESS_WINDOWS_CHILD_HPP
|
|
#define BOOST_PROCESS_WINDOWS_CHILD_HPP
|
|
|
|
#include <boost/move/move.hpp>
|
|
#include <boost/winapi/handles.hpp>
|
|
#include <boost/winapi/process.hpp>
|
|
#include <boost/winapi/jobs.hpp>
|
|
|
|
namespace boost { namespace process { namespace detail { namespace windows {
|
|
|
|
typedef ::boost::winapi::DWORD_ pid_t;
|
|
|
|
struct child_handle
|
|
{
|
|
::boost::winapi::PROCESS_INFORMATION_ proc_info{nullptr, nullptr, 0,0};
|
|
|
|
explicit child_handle(const ::boost::winapi::PROCESS_INFORMATION_ &pi) :
|
|
proc_info(pi)
|
|
{}
|
|
|
|
explicit child_handle(pid_t pid) :
|
|
proc_info{nullptr, nullptr, 0,0}
|
|
{
|
|
auto h = ::boost::winapi::OpenProcess(
|
|
::boost::winapi::PROCESS_ALL_ACCESS_,
|
|
static_cast<::boost::winapi::BOOL_>(0),
|
|
pid);
|
|
|
|
if (h == nullptr)
|
|
throw_last_error("OpenProcess() failed");
|
|
proc_info.hProcess = h;
|
|
proc_info.dwProcessId = pid;
|
|
}
|
|
|
|
child_handle() = default;
|
|
~child_handle()
|
|
{
|
|
::boost::winapi::CloseHandle(proc_info.hProcess);
|
|
::boost::winapi::CloseHandle(proc_info.hThread);
|
|
}
|
|
child_handle(const child_handle & c) = delete;
|
|
child_handle(child_handle && c) : proc_info(c.proc_info)
|
|
{
|
|
c.proc_info.hProcess = ::boost::winapi::invalid_handle_value;
|
|
c.proc_info.hThread = ::boost::winapi::invalid_handle_value;
|
|
}
|
|
child_handle &operator=(const child_handle & c) = delete;
|
|
child_handle &operator=(child_handle && c)
|
|
{
|
|
::boost::winapi::CloseHandle(proc_info.hProcess);
|
|
::boost::winapi::CloseHandle(proc_info.hThread);
|
|
proc_info = c.proc_info;
|
|
c.proc_info.hProcess = ::boost::winapi::invalid_handle_value;
|
|
c.proc_info.hThread = ::boost::winapi::invalid_handle_value;
|
|
return *this;
|
|
}
|
|
|
|
pid_t id() const
|
|
{
|
|
return static_cast<pid_t>(proc_info.dwProcessId);
|
|
}
|
|
|
|
typedef ::boost::winapi::HANDLE_ process_handle_t;
|
|
process_handle_t process_handle() const { return proc_info.hProcess; }
|
|
|
|
bool valid() const
|
|
{
|
|
return (proc_info.hProcess != nullptr) &&
|
|
(proc_info.hProcess != ::boost::winapi::INVALID_HANDLE_VALUE_);
|
|
}
|
|
bool in_group() const
|
|
{
|
|
::boost::winapi::BOOL_ value;
|
|
if (!::boost::winapi::IsProcessInJob(proc_info.hProcess, nullptr, &value))
|
|
throw_last_error("IsProcessinJob Failed");
|
|
return value!=0;
|
|
}
|
|
bool in_group(std::error_code &ec) const noexcept
|
|
{
|
|
::boost::winapi::BOOL_ value;
|
|
if (!::boost::winapi::IsProcessInJob(proc_info.hProcess, nullptr, &value))
|
|
ec = get_last_error();
|
|
return value!=0;
|
|
}
|
|
};
|
|
|
|
}}}}
|
|
|
|
#endif
|