天天看點

linux signal 函數對中斷的應用

轉載from:https://blog.csdn.net/engineer_james/article/details/83867809

在https://blog.csdn.net/engineer_james/article/details/83867466 寫一個android程序背景的過程

但是我們用CPP C 開發避免不了 配置設定記憶體或者 指針,如果在linux 程序跑的時候,出現死了或者退出導緻中斷,但是資源沒有正常釋放,造成資源浪費,是以需要用signal 處理

signal是linux系統的對所有動作的捕捉,然後進行處理

// #define SIGILL 4

信号      取值          預設動作   含義(發出信号的原因)
SIGHUP      1           Term    終端的挂斷或程序死亡
SIGINT      2           Term    來自鍵盤的中斷信号
SIGQUIT     3           Core    來自鍵盤的離開信号
SIGILL      4           Core    非法指令
SIGABRT     6           Core    來自abort的異常信号
SIGFPE      8           Core    浮點例外
SIGKILL     9           Term    殺死
SIGSEGV     11          Core    段非法錯誤(記憶體引用無效)
SIGPIPE     13          Term    管道損壞:向一個沒有讀程序的管道寫資料
SIGALRM     14          Term    來自alarm的計時器到時信号
SIGTERM     15          Term    終止
SIGUSR1     30,10,16    Term    使用者自定義信号1
SIGUSR2     31,12,17    Term    使用者自定義信号2
SIGCHLD     20,17,18    Ign     子程序停止或終止
SIGCONT     19,18,25    Cont    如果停止,繼續執行
SIGSTOP     17,19,23    Stop    非來自終端的停止信号
SIGTSTP     18,20,24    Stop    來自終端的停止信号
SIGTTIN     21,21,26    Stop    背景程序讀終端
SIGTTOU     22,22,27    Stop    背景程序寫終端
             
SIGBUS      10,7,10     Core    總線錯誤(記憶體通路錯誤)
SIGPOLL                 Term    Pollable事件發生(Sys V),與SIGIO同義
SIGPROF     27,27,29    Term    統計分布圖用計時器到時
SIGSYS      12,-,12     Core    非法系統調用(SVr4)
SIGTRAP     5           Core    跟蹤/斷點自陷
SIGURG      16,23,21    Ign     socket緊急信号(4.2BSD)
SIGVTALRM   26,26,28    Term    虛拟計時器到時(4.2BSD)
SIGXCPU     24,24,30    Core    超過CPU時限(4.2BSD)
SIGXFSZ     25,25,31    Core    超過檔案長度限制(4.2BSD)
             
SIGIOT      6           Core    IOT自陷,與SIGABRT同義
SIGEMT      7,-,7       Term
SIGSTKFLT   -,16,-      Term    協處理器堆棧錯誤(不使用)
SIGIO       23,29,22    Term    描述符上可以進行I/O操作
SIGCLD      -,-,18      Ign     與SIGCHLD同義
SIGPWR      29,30,19    Term    電力故障(System V)
SIGINFO     29,-,-              與SIGPWR同義
SIGLOST     -,-,-       Term    檔案鎖丢失
SIGWINCH    28,28,20    Ign     視窗大小改變(4.3BSD, Sun)
SIGUNUSED   -,31,-      Term    未使用信号(will be SIGSYS)
           

 ##signal 使用

signal函數的原型

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
           

參數1:signum 表示上面的動作編号

參數2:捕捉到信号需要的函數位址

如果是 SIG_IGN表示 屏蔽該信号 而設定 SIG_DFL 表示恢複預設行為 就是繼續捕捉

是以在初始化的時候,設定需要捕捉的信号

signal(SIGINT, signal_handler);//ctrl+c  signal_handler捕捉信号需要處理的函數
           
void signal_handler(int param){
	signal(SIGINT, SIG_IGN);//忽略後面的信号捕捉
	//釋放資源
	exit(0);
}
           

 用起來很簡單,但是對資源釋放很有作用

繼續閱讀