Signal.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_BASE_SIGNAL_H
00013 #define ZYPP_BASE_SIGNAL_H
00014
00015 #include <csignal>
00016 #include <iosfwd>
00017
00019 namespace zypp
00020 {
00021
00025 class SignalSaver
00026 {
00027 public:
00028 SignalSaver( int signum_r, sighandler_t handler_r )
00029 : _signum( signum_r )
00030 { _orighandler = ::signal( signum_r, handler_r ); }
00031 ~SignalSaver()
00032 { ::signal( _signum, _orighandler ); }
00033 private:
00034 int _signum;
00035 ::sighandler_t _orighandler;
00036 };
00037
00041 class SigprocmaskSaver
00042 {
00043 public:
00045 SigprocmaskSaver()
00046 { ::sigprocmask( SIG_SETMASK, NULL, &_origmask ); }
00048 ~SigprocmaskSaver()
00049 { ::sigprocmask( SIG_SETMASK, &_origmask, NULL ); }
00050 public:
00052 void block( int signum_r )
00053 {
00054 ::sigset_t mask;
00055 ::sigemptyset( & mask );
00056 ::sigaddset( & mask, signum_r );
00057 ::sigprocmask( SIG_BLOCK, &mask, NULL );
00058 }
00060 void unblock( int signum_r )
00061 {
00062 ::sigset_t mask;
00063 ::sigemptyset( & mask );
00064 ::sigaddset( & mask, signum_r );
00065 ::sigprocmask( SIG_UNBLOCK, &mask, NULL );
00066 }
00068 bool pending( int signum_r )
00069 {
00070 ::sigset_t mask;
00071 ::sigpending( &mask );
00072 return ::sigismember( &mask, signum_r );
00073 }
00075 void suspend()
00076 { ::sigsuspend( &_origmask ); }
00077 private:
00078 ::sigset_t _origmask;
00079 };
00080
00082 }
00084 #endif // ZYPP_BASE_SIGNAL_H