1.Linxu
下使用signal()函數獲取信號:

signal()函數:

[cpp] view plaincopy

  1. #include <signal.h>  

  2.   

  3.        typedef void (*sighandler_t)(int);  

  4.   

  5.        sighandler_t signal(int signum, sighandler_t handler);  

返回值:

[cpp] view plaincopy

  1. signal()  returns  the previous value of the signal handler, or SIG_ERR  

  2.        on error.  

關於返回值中涉及到的signal hander

[cpp] view plaincopy

  1.  signal() sets the disposition of the signal signum to handler, which is  

  2.        either SIG_IGN, SIG_DFL, or the address of a  programmer-defined  func‐  

  3.        tion (a "signal handler").  

  4.   

  5. If  the signal signum is delivered to the process, then one of the fol‐  

  6.        lowing happens:  

  7.   

  8.        *  If the disposition is set to SIG_IGN, then the signal is ignored.  

  9.   

  10.        *  If the disposition is set to SIG_DFL, then the default action  asso‐  

  11.           ciated with the signal (see signal(7)) occurs.  

  12.   

  13.        *  If  the disposition is set to a function, then first either the dis‐  

  14.           position is reset to SIG_DFL, or the signal is blocked  (see  Porta‐  

  15.           bility  below), and then handler is called with argument signum.  If  

  16.           invocation of the handler caused the signal to be blocked, then  the  

  17.           signal is unblocked upon return from the handler.  

  18.   

  19.        The signals SIGKILL and SIGSTOP cannot be caught or ignored.  

eg.:獲取用戶的CTRL + C CTRL + \ (進程中斷和結束命令)信號:

[cpp] view plaincopy

  1. #include <stdio.h>  

  2. #include <stdlib.h>  

  3. #include <string.h>  

  4. #include <signal.h>  

  5.   

  6. void my_func(int sign_no)  

  7. {  

  8.     if(sign_no == SIGINT)  

  9.     {  

  10.         printf("get the signal: SIGINT\n");  

  11.     }else if(sign_no == SIGQUIT)  

  12.     {  

  13.         printf("get the signal: SIGOUT\n");  

  14.     }  

  15. }  

  16.   

  17. int main(void)  

  18. {  

  19.     printf("waiting for signal SIGINT or SIGOUT ...\n");  

  20.     signal(SIGINT, my_func);  

  21.     signal(SIGQUIT, my_func);  

  22.       

  23.     pause();  

  24.       

  25.     return 0;  

  26. }  


2.sigaction()
的使用:



sigaction結搆體為:

[cpp] view plaincopy

  1. struct sigaction {  

  2.           union {  

  3.                   __sighandler_t _sa_handler;  

  4.                   void (*_sa_sigaction)(int, struct siginfo *, void *);  

  5.           } _u;  

  6.           sigset_t sa_mask;  

  7.           unsigned long sa_flags;  

  8.           void (*sa_restorer)(void);  

  9. };  



eg:衕樣是捕捉ctrl+c發送的SIGINTctrl+\發送的SIGQUIT信號

[cpp] view plaincopy

  1. #include <stdio.h>  

  2. #include <stdlib.h>  

  3. #include <string.h>  

  4. #include <signal.h>  

  5.   

  6. void my_func(int sign_no)  

  7. {  

  8.     if(sign_no == SIGINT)  

  9.     {  

  10.         printf("get the signal: SIGINT\n");  

  11.     }else if(sign_no == SIGQUIT)  

  12.     {  

  13.         printf("get the signal: SIGQUIT\n");  

  14.     }  

  15. }  

  16.   

  17. int main(void)  

  18. {  

  19.     struct sigaction action;  

  20.       

  21.     printf("Waiting for signal ...\n");  

  22.     action.sa_handler = my_func;  

  23.     sigemptyset(&action.sa_mask);  

  24.     action.sa_flags = 0;  

  25.     sigaction(SIGINT, &action, 0);  

  26.     sigaction(SIGQUIT, &action, 0);  

  27.     pause();  

  28.       

  29.     return 0;  

  30. }  

eg:自定義退出函數:

[cpp] view plaincopy

  1. sigact.sa_handler = mysighandler;  

  2.    sigemptyset(&sigact.sa_mask);  

  3.    sigact.sa_flags = 0;  

  4.    sigaction(SIGINT, &sigact, NULL);  

  5.    sigaction(SIGTERM, &sigact, NULL);  

  6.    sigaction(SIGQUIT, &sigact, NULL);  


信號表:

[cpp] view plaincopy

  1. 1) SIGHUP (掛起當運行進程的用戶注銷時通知該進程,使進程終止  

  2.   

  3. 2) SIGINT (中斷當用戶按下時,通知前台進程組終止進程  

  4.   

  5. 3) SIGQUIT (退出用戶按下或時通知進程,使進程終止  

  6.   

  7. 4) SIGILL (非法指令執行了非法指令,如可執行文件本身出現錯誤、試圖執行數據段、堆棧溢出  

  8.   

  9. 5) SIGTRAP 由斷點指令或其它trap指令產生debugger使用  

  10.   

  11. 6) SIGABRT (異常中止調用abort函數生成的信號  

  12.   

  13. 7) SIGBUS 非法地址包括內存地址對齊(alignment)出錯. eg: 訪問一個四個字長的整數但其地址不是4的倍數.  

  14.   

  15. 8) SIGFPE (算朮異常發生致命算朮運算錯誤,包括浮點運算錯誤、溢出及除數為0.  

  16.   

  17. 9) SIGKILL (確認殺死當用戶通過kill -9命令向進程發送信號時,可靠的終止進程  

  18.   

  19. 10) SIGUSR1 用戶使用  

  20.   

  21. 11) SIGSEGV (段越界當進程嘗試訪問不屬於自己的內存空間導致內存錯誤時,終止進程  

  22.   

  23. 12) SIGUSR2 用戶使用  

  24.   

  25. 13) SIGPIPE 寫至無讀進程的管道或者Socket通信SOCT_STREAM的讀進程已經終止,而再寫入。  

  26.   

  27. 14) SIGALRM (超時) alarm函數使用該信號,時鐘定時器超時響應  

  28.   

  29. 15) SIGTERM (軟中斷使用不帶參數的kill命令時終止進程  

  30.   

  31. 17) SIGCHLD (子進程結束當子進程終止時通知父進程  

  32.   

  33. 18) SIGCONT (暫停進程繼續讓一個停止(stopped)的進程繼續執行本信號不能被阻塞.  

  34.   

  35. 19) SIGSTOP (停止作業控制信號,暫停停止(stopped)進程的執行本信號不能被阻塞處理或忽略.  

  36.   

  37. 20) SIGTSTP (暫停/停止交互式停止信號, Ctrl-Z 發出這個信號  

  38.   

  39. 21) SIGTTIN 當后台作業要從用戶終端讀數據時終端驅動程序產生SIGTTIN信號  

  40.   

  41. 22) SIGTTOU 當后台作業要往用戶終端寫數據時終端驅動程序產生SIGTTOU信號  

  42.   

  43. 23) SIGURG "緊急"數據或網絡上帶外數據到達socket時產生.  

  44.   

  45. 24) SIGXCPU 超過CPU時間資源限制這個限制可以由getrlimit/setrlimit來讀取/改變。  

  46.   

  47. 25) SIGXFSZ 當進程企圖擴大文件以至於超過文件大小資源限制。  

  48.   

  49. 26) SIGVTALRM 虛擬時鐘信號類似於SIGALRM, 但是計算的是該進程占用的CPU時間.  

  50.   

  51. 27) SIGPROF (梗概時間超時) setitimer(2)函數設置的梗概統計間隔計時器(profiling interval timer)  

  52.   

  53. 28) SIGWINCH 窗口大小改變時發出.  

  54.   

  55. 29) SIGIO(異步I/O) 文件描述符准備就緒可以開始進行輸入/輸出操作.  

  56.   

  57. 30) SIGPWR 電源失效/重啟動  

  58.   

  59. 31) SIGSYS 非法的系統調用。  

在以上列出的信號中,
程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
不能恢復至默認動作的信號有:SIGILL,SIGTRAP
默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

此外,SIGIOSVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞。

 

 

http://blog.csdn.net/g457499940/article/details/14518783

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()