Linux下發送自定義訊號 C++程式碼
阿新 • • 發佈:2019-02-01
- #include <iostream>
- #include <sys/types.h>
- #include <sys/params.h>
- #include <signal.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <vector>
- using namespace std;
- #define MYSIG_MSG SIGUSR1 + 2 // 自定義的訊號,類似於windows平臺的 #define WM_MYMESSAGE WM_USER + 2
- #define MYSIG_MSG SIGUSR1 + 3
- #define MYSIG_MSG SIGUSR1 + 4
- #define MYSIG_MSG SIGUSR1 + 5
- void Handler_MSG(unsigned long sig) // 自定義的訊號處理函式,linux的訊號處理函式的引數是int,我這裡用unsigned long
- {
- write( 2, "Handler_MSG/n", 12 );
- }
- void Handler_MSG2(unsigned long sig)
- {
- write( 2, "Handler_MSG2/n", 13 );
- }
- void Handler_MSG3(unsigned long sig)
- {
- write( 2, "Handler_MSG3/n", 13 );
- }
- void Handler_MSG4(unsigned long sig)
- {
- write( 2, "Handler_MSG4/n", 13 );
- }
- class CSignalHandler // 單件訊號處理類,安裝和傳送自定義的訊號都呼叫此類的成員函式
- {
- protected:
- typedef void (*SIG_HANDLER_PF)(unsigned long sig); // 定義一個指向訊號處理函式的指標
- struct tagSigaction // 定義一個結構體,結構體的一個成員是自定義的訊號,另一個成員是個處理自定義訊號的函式的指標
- {
- unsigned long m_ulSigNumber;
- void (*m_Handler)(unsigned long sig);
- };
- typedef vector<tagSigaction> SIGACTION_VECTOR; // 自定義訊號的結構體陣列
- typedef SIGACTION_VECTOR::iterator SIGACTION_VECTOR_IT;// 迭代器型別,用來訪問vector
- SIGACTION_VECTOR m_SigactionVector; //把自定義的訊號及訊號處理函式,用vector儲存起來
- unsigned long m_ulCurrentSigNumber; // 當前接收到的訊號
- protected: // 建構函式定義成保護的,不讓使用者自己生成訊號處理類物件,
- CSignalHandler()
- {
- ActionDefaultSigHandler();
- }
- ~CSignalHandler()
- {
- }
- public:
- static CSignalHandler* GetSignalHandler() // 獲取訊號處理類的全域性訪問點
- {
- static CSignalHandler signalhandler;
- return &signalhandler;
- }
- protected:
- // 當用戶傳送一個自定義的訊號的時候,該函式就會被呼叫,然後根據使用者傳送的訊號,呼叫使用者設定的函式進行處理
- static void CustomSigHandler(int sig)
- {
- SIGACTION_VECTOR& SigactionVector = CSignalHandler::GetSignalHandler()->GetSigActionVector();
- SIGACTION_VECTOR_IT it;
- for ( it = SigactionVector.begin(); it != SigactionVector.end(); it++ )
- {
- if ( (*it).m_ulSigNumber == CSignalHandler::GetSignalHandler()->GetCurrentSigNumber() )
- {
- (*it).m_Handler( CSignalHandler::GetSignalHandler()->GetCurrentSigNumber() );
- }
- }
- }
- void ActionDefaultSigHandler() // 安裝預設的SIGUSR1訊號處理函式
- {
- struct sigaction act;
- act.sa_handler = CSignalHandler::CustomSigHandler;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- assert( sigaction(SIGUSR1, &act, NULL) >= 0 );
- }
- unsigned long GetCurrentSigNumber() const // 獲取當前傳送的訊號
- {
- return m_ulCurrentSigNumber;
- }
- void SetCurrentSigNumber(unsigned long ulCurrentSigNumber) // 當用戶傳送一個訊號時,先設定訊號值
- {
- m_ulCurrentSigNumber = ulCurrentSigNumber;
- }
- SIGACTION_VECTOR& GetSigActionVector() // 獲取使用者安裝的訊號vector的引用
- {
- return m_SigactionVector;
- }
- int Raise(unsigned long ulSig) // 傳送自定義的訊號
- {
- m_ulCurrentSigNumber = ulSig;
- return raise(SIGUSR1);
- }
- void Sigaction(unsigned long sig, SIG_HANDLER_PF pf) // 安裝自定義的訊號
- {
- struct tagSigaction sigact;
- sigact.m_ulSigNumber = sig;
- sigact.m_Handler = pf;
- m_SigactionVector.push_back(SIGACTION_VECTOR::value_type(sigact));
- }
- };
- int main(int argc, char* argv[])
- {
- CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG, Handler_MSG); // 安裝自定義的訊號
- CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG2, Handler_MSG2);
- CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG3, Handler_MSG3);
- CSignalHandler::GetSignalHandler()->Sigaction( MYSIG_MSG4, Handler_MSG4);
- CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG); // 傳送自定義的訊號
- CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG2);
- CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG3);
- CSignalHandler::GetSignalHandler()->Raise(MYSIG_MSG4);
- while (1)
- {
- sleep(1);
- }
- return 0;
- }