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>
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 {
44 {
45 public:
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 
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_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:125
#define CORE_POSIX_DLL_PUBLIC
Definition: visibility.h:26
Status
The Status enum wrap&#39;s the posix exit status.
Definition: exit.h:33
Flags
Flags enumerates different behavior when waiting for a child process to change state.
Definition: wait.h:42
The Process class models a process and possible operations on it.
Definition: process.h:44
StandardStream
The StandardStream enum wraps the POSIX standard streams.
CORE_POSIX_DLL_PUBLIC std::istream & cin() noexcept(true)
Access this process&#39;s stdin.
The Result struct encapsulates the result of waiting for a process state change.
Definition: wait.h:54
The DeathObserver class observes child process&#39; states and emits a signal when a monitored child has ...
Definition: child_process.h:56
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
#define CORE_POSIX_DLL_LOCAL
Definition: visibility.h:27
CORE_POSIX_DLL_PUBLIC std::ostream & cerr() noexcept(true)
Access this process&#39;s stderr.
The Process class models a child process of this process.
Definition: child_process.h:43
CORE_POSIX_DLL_PUBLIC std::ostream & cout() noexcept(true)
Access this process&#39;s stdout.