Linux 信號(二)—— signal 函數

弗洛伊德認爲:要解決這些苦惱,當事人就要經過回憶並理解本身早期的童年經歷,來得到對潛意識衝突的頓悟。弗洛伊德的療法被稱爲「精神分析」 (psychoanalysis),在 20 世紀的很長一段時間被心理衛生從業者廣爲採用。 —— 《Change Your Thinking》c++

ilocker:關注 Android 安全(新入行,0基礎) QQ: 2597294287編程

1 #include <signal.h>
2 void (*signal(int signo, void (*func)(int)))(int);

爲 signo 指定的信號設置信號處理程序。成功則返回指向以前信號處理程序的函數指針,出錯則返回 SIG_ERR。安全

若是看不懂 signal 的函數聲明,就要好好複習一下 c/c++ 的基礎(函數指針)了。函數

將 signal 函數的聲明簡化一下:學習

1 typedef void SigFunc(int); //信號處理函數原型
2 Sigfunc * signal(int signo, SigFunc * func);

簡單示例:spa

 1 void sig_handler(int signo) {
 2   if (SIGUSR1 == signo)
 3     printf(「received SIGUSR1.」);
 4   else
 5     printf(「received signal %d.」, signo);
 6 }
 7 
 8 int main() {
 9   if (SIG_ERR == signal(SIGUSR1, sig_handler))
10     printf(「can’t catch SIGUSR1」);
11 
12   for ( ; ; )
13     pause();
14 }

還可將信號處理函數設置爲 SIG_IGN (表示忽略此信號) 或 SIG_DFL (表示使用系統默認的信號處理程序)。unix

信號 SIGSTOP、SIGKILL 沒法捕獲或忽略。指針

記錄如下兩點,但沒有驗證,不肯定是否表述正確:code

  • 假設正在執行信號 A 的處理程序,此時來了另外一個信號 B,則會轉去執行 B 的信號處理程序,處理完畢以後,再接着執行 A 的信號處理程序。
  • 在進程中有一個軟中斷信號域,該域中每一位對應一個信號,當收到某一信號時,相應位會置位。因此,對於同一種信號,進程並不知道在處理以前已經收到過多少個。

除了 signal,還有 sigaction 函數能夠設置信號處理函數,比 signal 要複雜些,後面接着再寫筆記。blog

學習資料: 《unix 環境高級編程》

相關文章
相關標籤/搜索