linux sigint信號(hào)處理有哪些技巧

小樊
91
2024-07-17 21:35:49

在Linux中,處理SIGINT信號(hào)(即按下Ctrl+C時(shí)發(fā)送的信號(hào))的技巧有以下幾種:

  1. 使用signal()函數(shù)注冊(cè)信號(hào)處理函數(shù):可以使用signal()函數(shù)將自定義的信號(hào)處理函數(shù)注冊(cè)到SIGINT信號(hào)上。當(dāng)接收到SIGINT信號(hào)時(shí),系統(tǒng)會(huì)調(diào)用該信號(hào)處理函數(shù)。例如:

    #include <stdio.h>
    #include <signal.h>
    
    void sigint_handler(int sig) {
        printf("Received SIGINT signal\n");
    }
    
    int main() {
        signal(SIGINT, sigint_handler);
        
        while (1) {
            // 無(wú)限循環(huán)
        }
        
        return 0;
    }
    
  2. 使用sigaction()函數(shù)注冊(cè)信號(hào)處理函數(shù):與signal()函數(shù)相比,sigaction()函數(shù)提供了更多的控制選項(xiàng),可以更靈活地處理信號(hào)。例如:

    #include <stdio.h>
    #include <signal.h>
    
    void sigint_handler(int sig) {
        printf("Received SIGINT signal\n");
    }
    
    int main() {
        struct sigaction sa;
        sa.sa_handler = sigint_handler;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        
        sigaction(SIGINT, &sa, NULL);
        
        while (1) {
            // 無(wú)限循環(huán)
        }
        
        return 0;
    }
    
  3. 使用sigprocmask()函數(shù)阻塞/解除阻塞信號(hào):可以使用sigprocmask()函數(shù)設(shè)置信號(hào)掩碼,阻塞或解除阻塞指定的信號(hào)。在處理SIGINT信號(hào)時(shí),可以在信號(hào)處理函數(shù)中使用sigprocmask()函數(shù)來(lái)屏蔽其他信號(hào),以保證信號(hào)處理的穩(wěn)定性。例如:

    #include <stdio.h>
    #include <signal.h>
    
    void sigint_handler(int sig) {
        sigset_t mask;
        sigemptyset(&mask);
        sigaddset(&mask, SIGINT);
        sigprocmask(SIG_BLOCK, &mask, NULL);
        
        printf("Received SIGINT signal\n");
        
        sigprocmask(SIG_UNBLOCK, &mask, NULL);
    }
    
    int main() {
        signal(SIGINT, sigint_handler);
        
        while (1) {
            // 無(wú)限循環(huán)
        }
        
        return 0;
    }
    

這些技巧可以幫助程序員更好地處理SIGINT信號(hào),確保程序在接收到SIGINT信號(hào)時(shí)能夠正確地進(jìn)行處理。

0