1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // 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
|