1. 信號的概念
每個信號都有一個以SIG開頭的名字。
在頭文件<signal.h>中,這些信號都被定義爲正整數。不存在編號爲0的信號。
在信號發生的時候,可以進行一下處理:
1)忽略此信號,有兩種信號不能被忽略(SIGKILL,SIGSTOP)。
2)捕捉信號,通知內核在某種信號發生時調用一個用戶函數。
3)執行系統默認動作(大多數信號的系統默認動作是終止進程)。
常用的信號:
SIGABRT 異常終止
SIGALRM 超時
SIGFPE 算數異常
SIGINT 終端中斷符
SIGKILL 寫至無讀進程的管道
SIGSEGV 無效內存引用
SIGUSR1 用戶定義
SIGUSR2 用戶定義
2. signal函數
#include <signal.h>
void (*signal (int signo, void (*func)(int)))(int);
signo: 信號名
func: 當接到此信號後要調用的函數的地址,捕捉該信號。
如果只能固定SIG_IGN則標識忽略此信號。
SIG_DEF則表示接到此信號後的動作時系統默認動作。
簡化此函數原型:
typedef void Sigfunc(int);
Sigfunc *signal(int , Sigfunc *);
3. 簡單示例
#include <iostream>
#include <signal.h>
using namespace std;
static void signalFunc(int args)
{
cout << "SIGINT is got" << endl;
exit(1);
}
int main()
{
if (signal(SIGINT, signalFunc) == SIG_ERR) {
cout << "get SIGINT error" << endl;
}
getchar();
return 0;
}