歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中的信號處理

程序經常會異常終止(比如段錯誤),或者認為終止(比如按下了CTRL+C),這時可能一些動態申請的資源就得不到釋放,或者程序有些其他需要處理的操作(如保存)。

C語言的標准庫<signal.h>中提供了一些用於處理處理程序運行期間的異常的功能,如處理來源於外部的中斷信號或程序執行期間出現的錯誤等事件。

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

signal()用於確定以後當信號sig出現時的處理方法。如果handler的值是SIG_DFL,那麼就采用實現定義的缺省行為;如果handler的值是SIG_IGN,那麼就忽略該信號;否則,調用handler所指向的函數(參數為信號類型)。有效的信號包括:

SIGABRT 異常終止,如調用abort()。 SIGFPE 算術運算出錯,如除數為0或溢出。 SIGILL 非法函數映象,如非法指令。 SIGINT 交互式信號,如中斷。 SIGSEGV 非法訪問存儲器,如訪問不存在的內存單元。 SIGTERM 發送給本程序的終止請求信號。當隨後出現信號sig時,就中斷正在執行的操作,轉而執行信號處理函數(*handler)(sig)。如果從信號處理程序中返回,則從中斷的位置繼續執行。signal()返回信號sig原來的的handler;如果出錯,則返回SIG_ERR。

例子:

1、除數為0

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <signal.h>   
  4.   
  5. void func(int sig)  
  6. {  
  7.     printf("Signal deal!\n");  
  8.     printf("ERROR:Divisor is 0!\n");  
  9.     exit(0);  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     signal(SIGFPE,func);  
  15.     printf("10/0=\n",10/0);  
  16.       
  17.     return 0;  
  18. }  
輸出:
  1. Signal deal!  
  2. ERROR:Divisor is 0!  

2、程序被CTRL+C終止:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <signal.h>   
  4.   
  5. void func(int sig)  
  6. {  
  7.     printf("Signal deal!\n");  
  8.     printf("Signal was stop by ctrl+c!\n");  
  9.     exit(0);  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     signal(SIGINT,func);  
  15.   
  16.     while(1){  
  17.         sleep(1);  
  18.     }  
  19.       
  20.     return 0;  
  21. }  
按下CTRL+C,輸出:
  1. ^CSignal deal!  
  2. Signal was stop by ctrl+c!  
Copyright © Linux教程網 All Rights Reserved