OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
process_signal.h
Go to the documentation of this file.
1 //
2 // Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3 //
4 
5 #ifndef SRC_IO_PROCESS_SIGNAL_H_
6 #define SRC_IO_PROCESS_SIGNAL_H_
7 
8 #include <signal.h>
9 #include <unistd.h>
10 #include <vector>
11 #include <map>
12 #include <boost/function.hpp>
13 #include <boost/asio.hpp>
14 #include <boost/system/error_code.hpp>
15 
16 class EventManager;
17 class ProcessSignalTest;
18 
19 namespace process {
20 
21 class Signal {
22  public:
23  typedef boost::function<
24  void(const boost::system::error_code& error, int sig,
25  pid_t pid, int status)> SignalChildHandler;
26  typedef boost::function<
27  void(const boost::system::error_code& error, int sig)> SignalHandler;
28  typedef std::map<int, std::vector<SignalHandler> > SignalCallbackMap;
29 
30  Signal(EventManager *evm, const SignalCallbackMap &sig_callback_map,
31  const std::vector<SignalChildHandler> &sigchld_callbacks,
32  bool always_handle_sigchild);
33  Signal(EventManager *evm, const SignalCallbackMap &sig_callback_map);
34  virtual ~Signal();
35 
36  void Initialize();
37  void Terminate();
38  void RegisterHandler(int sig, SignalHandler handler);
39  void RegisterHandler(SignalChildHandler handler);
40 
41  private:
42  boost::system::error_code AddSignal(int sig);
43  boost::system::error_code InitializeSigChild();
44  void RegisterSigHandler();
45  void HandleSig(const boost::system::error_code& error, int sig);
46  bool HandleSigOsSpecific(const boost::system::error_code& error, int sig);
47  void NotifySig(const boost::system::error_code &error, int sig);
48  void NotifySigChld(const boost::system::error_code &error, int sig, int pid,
49  int status);
50  virtual int WaitPid(int pid, int *status, int options);
51 
52  boost::asio::signal_set signal_;
54  std::vector<SignalChildHandler> sigchld_callbacks_;
56  friend class ::ProcessSignalTest;
57 };
58 
59 } // namespace process
60 
61 #endif // SRC_IO_PROCESS_SIGNAL_H_
void HandleSig(const boost::system::error_code &error, int sig)
void RegisterHandler(int sig, SignalHandler handler)
boost::system::error_code AddSignal(int sig)
std::vector< SignalChildHandler > sigchld_callbacks_
static Options options
void NotifySig(const boost::system::error_code &error, int sig)
bool always_handle_sigchild_
std::map< int, std::vector< SignalHandler > > SignalCallbackMap
boost::function< void(const boost::system::error_code &error, int sig)> SignalHandler
virtual int WaitPid(int pid, int *status, int options)
SignalCallbackMap sig_callback_map_
boost::asio::signal_set signal_
void NotifySigChld(const boost::system::error_code &error, int sig, int pid, int status)
boost::system::error_code InitializeSigChild()
boost::function< void(const boost::system::error_code &error, int sig, pid_t pid, int status)> SignalChildHandler
bool HandleSigOsSpecific(const boost::system::error_code &error, int sig)
static EventManager evm
Signal(EventManager *evm, const SignalCallbackMap &sig_callback_map, const std::vector< SignalChildHandler > &sigchld_callbacks, bool always_handle_sigchild)