process-cpp: /build/process-cpp/src/process-cpp-3.0.1/include/core/posix/child_process.h Source File

process-cpp 3.0.0 A simple convenience library for handling processes in C++11.

child_process.h
Go to the documentation of this file.
1 /*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Thomas Voß <thomas.voss@canonical.com>
17 */
18
19 #ifndef CORE_POSIX_CHILD_PROCESS_H_
20 #define CORE_POSIX_CHILD_PROCESS_H_
21
22 #include <core/posix/process.h>
23 #include <core/posix/standard_stream.h>
24 #include <core/posix/visibility.h>
25
26 #include <core/signal.h>
27
28 #include <iosfwd>
29 #include <functional>
30
31 namespace core
32 {
33 namespace posix
34 {
43 class CORE_POSIX_DLL_PUBLIC ChildProcess : public Process
44 {
45 public:
56 class DeathObserver
57 {
58 public:
64 static std::unique_ptr<DeathObserver> create_once_with_signal_trap(
65 std::shared_ptr<SignalTrap> trap);
66
67 DeathObserver(const DeathObserver&) = delete;
68 virtual ~DeathObserver() = default;
69
70 DeathObserver& operator=(const DeathObserver&) = delete;
71 bool operator==(const DeathObserver&) const = delete;
72
78 virtual bool add(const ChildProcess& child) = 0;
79
85 virtual bool has(const ChildProcess& child) const = 0;
86
90 virtual const core::Signal<ChildProcess>& child_died() const = 0;
91
95 virtual void on_sig_child() = 0;
96
97 protected:
98 DeathObserver() = default;
99 };
100
105 static ChildProcess invalid();
106
107 ~ChildProcess();
108
115 wait::Result wait_for(const wait::Flags& flags);
116
120 std::istream& cerr();
121
125 std::ostream& cin();
126
130 std::istream& cout();
131
132 private:
133 friend ChildProcess fork(const std::function<posix::exit::Status()>&, const StandardStream&);
134 friend ChildProcess vfork(const std::function<posix::exit::Status()>&, const StandardStream&);
135
136 class CORE_POSIX_DLL_LOCAL Pipe
137 {
138 public:
139 static Pipe invalid();
140
141 Pipe();
142 Pipe(const Pipe& rhs);
143 ~Pipe();
144
145 Pipe& operator=(const Pipe& rhs);
146
147 int read_fd() const;
148 void close_read_fd();
149
150 int write_fd() const;
151 void close_write_fd();
152
153 private:
154 Pipe(int fds[2]);
155 int fds[2];
156 };
157
158 CORE_POSIX_DLL_LOCAL ChildProcess(pid_t pid,
159 const Pipe& stdin,
160 const Pipe& stdout,
161 const Pipe& stderr);
162
163 struct CORE_POSIX_DLL_LOCAL Private;
164 std::shared_ptr<Private> d;
165 };
166 }
167 }
168
169 #endif // CORE_POSIX_CHILD_PROCESS_H_
CORE_POSIX_DLL_LOCAL
#define CORE_POSIX_DLL_LOCAL
Definition: visibility.h:27
configure_file
configure_file(process-cpp.pc.in process-cpp.pc @ONLY) install(FILES $
Definition: CMakeLists.txt:17
core::posix::ChildProcess::DeathObserver::has
virtual bool has(const ChildProcess &child) const =0
has checks whether the specified child is observed.
if
cmake_build_type_lower if("${cmake_build_type_lower}" STREQUAL "debug") option(PROCESS_CPP_ENABLE_DOC_GENERATION_BY_DEFAULT "Generate package by default" OFF) else() option(PROCESS_CPP_ENABLE_DOC_GENERATION_BY_DEFAULT "Generate package by default" ON) endif() if(PROCESS_CPP_ENABLE_DOC_GENERATION) if($
Definition: CMakeLists.txt:25
core::posix::vfork
CORE_POSIX_DLL_PUBLIC ChildProcess vfork(const std::function< posix::exit::Status()> &main, const StandardStream &flags)
fork vforks a new process and executes the provided main function in the newly forked process.
Definition: fork.cpp:122
core::posix::ChildProcess::DeathObserver::add
virtual bool add(const ChildProcess &child)=0
add adds the specified child to the list of observed child processes.
core::posix::StandardStream
StandardStream
The StandardStream enum wraps the POSIX standard streams.
Definition: standard_stream.h:34
visibility.h
z
usr bin c fPIC version build process cpp src process cpp symbols map sort as z
Definition: link.txt:1
add_library
add_library(process-cpp SHARED core/posix/backtrace.h core/posix/backtrace.cpp core/posix/child_process.cpp core/posix/exec.cpp core/posix/fork.cpp core/posix/process.cpp core/posix/process_group.cpp core/posix/signal.cpp core/posix/signalable.cpp core/posix/standard_stream.cpp core/posix/wait.cpp core/posix/this_process.cpp core/posix/linux/proc/process/oom_adj.cpp core/posix/linux/proc/process/oom_score.cpp core/posix/linux/proc/process/oom_score_adj.cpp core/posix/linux/proc/process/stat.cpp core/testing/cross_process_sync.cpp core/testing/fork_and_run.cpp) target_link_libraries(process-cpp $
Definition: CMakeLists.txt:17
core::posix::ChildProcess::DeathObserver::DeathObserver
DeathObserver()=default
option
option(PROCESS_CPP_ENABLE_DOC_GENERATION "Generate package documentation with doxygen" ON) string(TOLOWER "$
Definition: CMakeLists.txt:17
CORE_POSIX_DLL_PUBLIC
#define CORE_POSIX_DLL_PUBLIC
Definition: visibility.h:26
O1
usr bin c fPIC version build process cpp src process cpp symbols map O1
Definition: link.txt:1
core::posix::ChildProcess::DeathObserver
The DeathObserver class observes child process' states and emits a signal when a monitored child has ...
Definition: child_process.h:57
core::posix::exit::Status
Status
The Status enum wrap's the posix exit status.
Definition: exit.h:34
core::posix::wait::Result
The Result struct encapsulates the result of waiting for a process state change.
Definition: wait.h:55
core::posix::this_process::cerr
CORE_POSIX_DLL_PUBLIC std::ostream & cerr() noexcept(true)
Access this process's stderr.
Definition: this_process.cpp:171
process.h
core::posix::exec
CORE_POSIX_DLL_PUBLIC ChildProcess exec(const std::string &fn, const std::vector< std::string > &argv, const std::map< std::string, std::string > &env, const StandardStream &flags)
exec execve's the executable with the provided arguments and environment.
Definition: exec.cpp:33
set
set(IS_ALL ALL) endif() find_package(Doxygen) if(DOXYGEN_FOUND) configure_file($
Definition: CMakeLists.txt:42
script
usr bin c fPIC version script
Definition: link.txt:1
standard_stream.h
core::posix::fork
CORE_POSIX_DLL_PUBLIC ChildProcess fork(const std::function< posix::exit::Status()> &main, const StandardStream &flags)
fork forks a new process and executes the provided main function in the newly forked process.
Definition: fork.cpp:57
core::posix::ChildProcess
The Process class models a child process of this process.
Definition: child_process.h:44
D_FORTIFY_SOURCE
usr bin c fPIC D_FORTIFY_SOURCE
Definition: link.txt:1
core
Definition: child_process.h:32
core::posix::ChildProcess::DeathObserver::~DeathObserver
virtual ~DeathObserver()=default
core::posix::this_process::cin
CORE_POSIX_DLL_PUBLIC std::istream & cin() noexcept(true)
Access this process's stdin.
Definition: this_process.cpp:161
Wl
usr bin c fPIC version build process cpp src process cpp symbols map Wl
Definition: link.txt:1
core::posix::ChildProcess::DeathObserver::on_sig_child
virtual void on_sig_child()=0
Checks and reaps all child processes registered with the observer instance.
cmake_minimum_required
cmake_minimum_required(VERSION 2.8) project(process-cpp) find_package(Boost COMPONENTS iostreams system REQUIRED) find_package(PkgConfig REQUIRED) find_package(Threads REQUIRED) pkg_check_modules(PROPERTIES_CPP properties-cpp) set(CMAKE_MODULE_PATH $
Definition: CMakeLists.txt:17
core::posix::this_process::cout
CORE_POSIX_DLL_PUBLIC std::ostream & cout() noexcept(true)
Access this process's stdout.
Definition: this_process.cpp:166
lpthread
lpthread
Definition: CMakeCache.txt:359
common
usr bin c fPIC version build process cpp src process cpp symbols map sort common
Definition: link.txt:1
needed
usr bin c fPIC version build process cpp src process cpp symbols map sort as needed
Definition: link.txt:1
core::posix::ChildProcess::DeathObserver::child_died
virtual const core::Signal< ChildProcess > & child_died() const =0
child_died is emitted whenever an observed child ceases to exist.
soname
usr bin c fPIC version build process cpp src process cpp symbols map sort as now no undefined shared soname
Definition: link.txt:1
core::posix::ChildProcess::DeathObserver::operator=
DeathObserver & operator=(const DeathObserver &)=delete
relro
usr bin c fPIC version build process cpp src process cpp symbols map sort as relro
Definition: link.txt:1
core::posix::ChildProcess::DeathObserver::operator==
bool operator==(const DeathObserver &) const =delete
core::posix::ChildProcess::DeathObserver::DeathObserver
DeathObserver(const DeathObserver &)=delete
core::posix::Process
The Process class models a process and possible operations on it.
Definition: process.h:45
core::testing::fork_and_run
CORE_POSIX_DLL_PUBLIC ForkAndRunResult fork_and_run(const std::function< core::posix::exit::Status()> &service, const std::function< core::posix::exit::Status()> &client)
Forks two processes for both the service and the client.
Definition: fork_and_run.cpp:41
core::posix::wait::Flags
Flags
Flags enumerates different behavior when waiting for a child process to change state.
Definition: wait.h:43