sigaction函式解析

wzm10455發表於2013-04-20

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作(可同時兩種操作)。

他是POSIX的訊號介面,而signal()是標準C的訊號介面(如果程式必須在非POSIX系統上執行,那麼就應該使用這個介面)

給訊號signum設定新的訊號處理函式act, 同時保留該訊號原有的訊號處理函式oldact

int sigaction(int signo,const struct sigaction *restrict act,

              struct sigaction *restrict oact);

結構sigaction定義如下:

struct sigaction{
  void (*sa_handler)(int);
   sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler欄位包含一個訊號捕捉函式的地址

sa_mask欄位說明了一個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程式的訊號遮蔽字復位為原先值。

sa_flag是一個選項,主要理解兩個

SA_INTERRUPT 由此訊號中斷的系統呼叫不會自動重啟
SA_RESTART 由此訊號中斷的系統呼叫會自動重啟

SA_SIGINFO 提供附加資訊,一個指向siginfo結構的指標以及一個指向程式上下文識別符號的指標

最後一個引數是一個替代的訊號處理程式,當設定SA_SIGINFO時才會用他。

例子:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void show_handler(int sig)
{
    printf("I got signal %d\n", sig);
    int i;
    for(i = 0; i < 5; i++) {
        printf("i = %d\n", i);
        sleep(1);
    }
}

int main(void)
{
    int i = 0;
    struct sigaction act, oldact;
    act.sa_handler = show_handler;
    sigaddset(&act.sa_mask, SIGQUIT); //見注(1)
    act.sa_flags = SA_RESETHAND | SA_NODEFER; //見注(2)
    //act.sa_flags = 0; //見注(3)

    sigaction(SIGINT, &act, &oldact);
    while(1) {
        sleep(1);
        printf("sleeping %d\n", i);
        i++;
    }
}


注:
(1)    如果在訊號SIGINT(Ctrl + c)的訊號處理函式show_handler執行過程中,本程式收到訊號SIGQUIT(Crt+\),將阻塞該訊號,直到show_handler執行結束才會處理訊號SIGQUIT。


(2)    SA_NODEFER       一般情況下, 當訊號處理函式執行時,核心將阻塞<該給定訊號 -- SIGINT>。但是如果設定了SA_NODEFER標記, 那麼在該訊號處理函式執行時,核心將不會阻塞該訊號。 SA_NODEFER是這個標記的正式的POSIX名字(還有一個名字SA_NOMASK,為了軟體的可移植性,一般不用這個名字)   
       SA_RESETHAND    當呼叫訊號處理函式時,將訊號的處理函式重置為預設值。 SA_RESETHAND是這個標記的正式的POSIX名字(還有一個名字SA_ONESHOT,為了軟體的可移植性,一般不用這個名字)   


(3)    如果不需要重置該給定訊號的處理函式為預設值;並且不需要阻塞該給定訊號(無須設定sa_flags標誌),那麼必須將sa_flags清零,否則執行將會產生段錯誤。但是sa_flags清零後可能會造成訊號丟失!

http://webcache.googleusercontent.com/search?q=cache:B2HsD1Zf2f8J:hi.baidu.com/operationsystem/blog/item/bb215411f4dc61f4c2ce79e6.html/cmtid/c150423c8b8feae13d6d97b0+sigaction&cd=1&hl=zh-CN&ct=clnk

相關文章