1 // Copyright (c) 2019 Klemens D. Morgenstern
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #ifndef BOOST_PROCESS_HANDLES_HPP_
7 #define BOOST_PROCESS_HANDLES_HPP_
8
9 /**
10 * \file boost/process/handles.hpp
11 *
12 * Defines functions to obtain handles of the current process and limit the amount for inherited ones.
13 */
14
15 #include <boost/process/detail/config.hpp>
16
17 #if defined(BOOST_POSIX_API)
18 #include <boost/process/detail/posix/handles.hpp>
19 #elif defined(BOOST_WINDOWS_API)
20 #include <boost/process/detail/windows/handles.hpp>
21 #endif
22
23 #include <boost/process/detail/used_handles.hpp>
24
25
26 namespace boost { namespace this_process
27 {
28
29 ///The native type for handles
30 using native_handle_type = ::boost::process::detail::api::native_handle_type;
31
32 /**
33 * Get a snapshot of all handles of the process (i.e. file descriptors on posix and handles on windows) of the current process.
34 *
35 * \note This function might not work on certain posix systems.
36 *
37 * \note On Windows version older than windows 8 this function will iterate all the system handles, meaning it might be quite slow.
38 *
39 * \warning This functionality is utterly prone to race conditions, since other threads might open or close handles.
40 *
41 * \return The list of all open handles of the current process
42 */
get_handles()43 inline std::vector<native_handle_type> get_handles()
44 {
45 return ::boost::process::detail::api::get_handles();
46 }
47
48
49 /** \overload std::vector<native_handle_type> get_handles() */
get_handles(std::error_code & ec)50 inline std::vector<native_handle_type> get_handles(std::error_code &ec)
51 {
52 return ::boost::process::detail::api::get_handles(ec);
53 }
54
55 /** Determines if a given handle is a a stream-handle, i.e. any handle that can be used with read and write functions.
56 * Stream handles include pipes, regular files and sockets.
57 *
58 * \return Indicates if it's a stream handle.
59 */
is_stream_handle(native_handle_type handle)60 inline bool is_stream_handle(native_handle_type handle)
61 {
62 return ::boost::process::detail::api::is_stream_handle(handle);
63 }
64
65
66 /** \overload bool is_stream_handle(native_handle_type handle) */
is_stream_handle(native_handle_type handle,std::error_code & ec)67 inline bool is_stream_handle(native_handle_type handle, std::error_code &ec)
68 {
69 return ::boost::process::detail::api::is_stream_handle(handle, ec);
70 }
71
72 }
73 namespace process
74 {
75
76 namespace detail
77 {
78
79 using limit_handles_ = ::boost::process::detail::api::limit_handles_;
80
81
82 }
83
84 /**
85 * The limit_handles property sets all properties to be inherited only expcitly. It closes all unused file-descriptors on posix after the fork and
86 * removes the inherit flags on windows.
87 *
88 * \note This is executed after the fork on posix.
89 *
90 * \code{.cpp}
91 * system("gcc", limit_handles);
92 * \endcode
93 *
94 * Since limit also closes the standard handles unless they are explicitly redirected they can be ignored by `limit_handles` in the following way.
95 *
96 * \code{.cpp}
97 * system("gcc", limit_handles.allowStd())
98 * \endcode
99 *
100 */
101 const static ::boost::process::detail::api::limit_handles_ limit_handles;
102
103
104 }
105 }
106
107 #endif //BOOST_PROCESS_HANDLES_HPP_
108