1. 程式人生 > >Linux下發送自定義訊號 C++程式碼

Linux下發送自定義訊號 C++程式碼

  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <sys/params.h>
  4. #include <signal.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <vector>
  8. using namespace std;
  9. #define MYSIG_MSG        SIGUSR1 + 2                        // 自定義的訊號,類似於windows平臺的 #define WM_MYMESSAGE        WM_USER + 2
  10. #define MYSIG_MSG        SIGUSR1 + 3
  11. #define MYSIG_MSG        SIGUSR1 + 4
  12. #define MYSIG_MSG        SIGUSR1 + 5
  13. void Handler_MSG(unsigned long sig)                // 自定義的訊號處理函式,linux的訊號處理函式的引數是int,我這裡用unsigned long
  14. {
  15.         write( 2, "Handler_MSG/n", 12 );
  16. }
  17. void Handler_MSG2(unsigned long sig)
  18. {
  19.         write( 2, "Handler_MSG2/n", 13 );
  20. }
  21. void Handler_MSG3(unsigned long sig)
  22. {
  23.         write( 2, "Handler_MSG3/n", 13 );
  24. }
  25. void Handler_MSG4(unsigned long sig)
  26. {
  27.         write( 2, "Handler_MSG4/n", 13 );
  28. }
  29. class CSignalHandler                                        // 單件訊號處理類,安裝和傳送自定義的訊號都呼叫此類的成員函式
  30. {
  31. protected:
  32.         typedef void (*SIG_HANDLER_PF)(unsigned long sig);                // 定義一個指向訊號處理函式的指標
  33.         struct tagSigaction                                                                                // 定義一個結構體,結構體的一個成員是自定義的訊號,另一個成員是個處理自定義訊號的函式的指標
  34.         {
  35.                 unsigned long m_ulSigNumber;
  36.                 void (*m_Handler)(unsigned long sig);
  37.         };
  38.         typedef vector<tagSigaction>        SIGACTION_VECTOR;                // 自定義訊號的結構體陣列
  39.         typedef SIGACTION_VECTOR::iterator SIGACTION_VECTOR_IT;// 迭代器型別,用來訪問vector
  40.         SIGACTION_VECTOR        m_SigactionVector;                                        //把自定義的訊號及訊號處理函式,用vector儲存起來
  41.         unsigned long m_ulCurrentSigNumber;                                                // 當前接收到的訊號
  42. protected:                                                                                                        // 建構函式定義成保護的,不讓使用者自己生成訊號處理類物件,
  43.         CSignalHandler()
  44.         {
  45.                 ActionDefaultSigHandler();
  46.         }
  47.         ~CSignalHandler()
  48.         {
  49.         }
  50. public:
  51.         static CSignalHandler* GetSignalHandler()                                // 獲取訊號處理類的全域性訪問點
  52.         {
  53.                 static CSignalHandler signalhandler;
  54.                 return &signalhandler;
  55.         }
  56. protected:
  57. // 當用戶傳送一個自定義的訊號的時候,該函式就會被呼叫,然後根據使用者傳送的訊號,呼叫使用者設定的函式進行處理
  58.         static void CustomSigHandler(int sig)                                               
  59. {
  60.                 SIGACTION_VECTOR& SigactionVector = CSignalHandler::GetSignalHandler()->GetSigActionVector();
  61.                 SIGACTION_VECTOR_IT it;
  62.                 for ( it = SigactionVector.begin(); it != SigactionVector.end(); it++ )
  63.                 {
  64.                         if ( (*it).m_ulSigNumber == CSignalHandler::GetSignalHandler()->GetCurrentSigNumber() )
  65.                         {
  66.                                 (*it).m_Handler( CSignalHandler::GetSignalHandler()->GetCurrentSigNumber() );
  67.                         }
  68.                 }
  69.         }
  70.         void ActionDefaultSigHandler()                                                        // 安裝預設的SIGUSR1訊號處理函式
  71.         {
  72.                 struct sigaction act;
  73.                 act.sa_handler = CSignalHandler::CustomSigHandler;
  74.                 sigemptyset(&act.sa_mask);
  75.                 act.sa_flags = 0;
  76.                 assert( sigaction(SIGUSR1, &act, NULL) >= 0 );
  77.         }
  78.         unsigned long GetCurrentSigNumber() const                                // 獲取當前傳送的訊號
  79.         {
  80.                 return m_ulCurrentSigNumber;
  81.         }
  82.         void SetCurrentSigNumber(unsigned long ulCurrentSigNumber)        // 當用戶傳送一個訊號時,先設定訊號值
  83.         {
  84.                 m_ulCurrentSigNumber = ulCurrentSigNumber;
  85.         }
  86.         SIGACTION_VECTOR& GetSigActionVector()                                // 獲取使用者安裝的訊號vector的引用
  87.         {
  88.                 return m_SigactionVector;
  89.         }
  90.         int Raise(unsigned long ulSig)                                                // 傳送自定義的訊號
  91.         {
  92.                 m_ulCurrentSigNumber = ulSig;                                       
  93.                 return raise(SIGUSR1);
  94.         }
  95.         void Sigaction(unsigned long sig, SIG_HANDLER_PF pf)        // 安裝自定義的訊號
  96.         {
  97.                 struct tagSigaction sigact;
  98.                 sigact.m_ulSigNumber = sig;
  99.                 sigact.m_Handler = pf;
  100.                 m_SigactionVector.push_back(SIGACTION_VECTOR::value_type(sigact));
  101.         }
  102. };
  103. int main(int argc, char* argv[])
  104. {
  105.         CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG, Handler_MSG);                        // 安裝自定義的訊號
  106.         CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG2, Handler_MSG2);
  107.         CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG3, Handler_MSG3);
  108.         CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG4, Handler_MSG4);
  109.         CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG);        // 傳送自定義的訊號
  110.         CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG2);
  111.         CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG3);
  112.         CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG4);
  113.         while (1)
  114.         {
  115.                 sleep(1);
  116.         }
  117.         return 0;
  118. }