在學習linux信號處理時發現在結構體sigaction中定義了一個信號處理函數指針sa_sigaction,而這個指針指向的是一個擁有三個參數的函數,結構體中定義的函數指針為:void (*sa_sigaction)(int, struct siginfo_t *, void *)
在筆者的資料上並沒有對siginfo_t這個結構體的詳細定義,而這個結構體中記錄的又是信號的細節值,讓人十分在意。在通過在網上查找資料,筆者發現了這個結構體的詳細定義:
1 typedef struct { 2 int si_signo; 3 int si_code; 4 union sigval si_value; 5 int si_errno; 6 pid_t si_pid; 7 uid_t si_uid; 8 void *si_addr; 9 int si_status; 10 int si_band; 11 } siginfo_t;
下面介紹各個變量的含義。
si_signo: signal number的簡寫,該變量用來存儲信號編號並且恆有值;
si_code: signal code的簡寫,這個變量取值較多,這里不展開討論,具體可從下面鏈接處獲取;
si_value: signal value的簡寫,通過定義可以得知這個變量是一個結構體,該結構體定義如下:
1 union sigval { 2 int sival_int; 3 void *sival_ptr; 4 };
si_errno: 如果該位不為0,則和信號在一起的有一個錯誤代碼,即errno(可以理解成信號發生錯誤)
si_pid: 發送該信號的進程id
si_uid: 發送該信號的用戶id
si_addr: 錯誤發生的地址
這里筆者水平有限,如果覺得文章有錯誤或者不全面,可以通過下面的網址查看,里面有這篇隨筆的參考:
https://www.mkssoftware.com/docs/man5/siginfo_t.5.asp#Signal_Codes
