函數(shù)signal
UNIX系統(tǒng)信號(hào)機(jī)制最簡(jiǎn)單的接口是signal函數(shù)。
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
返回值:若成功,返回以前的信號(hào)處理配置;若出錯(cuò),返回SIG_ERR
signal函數(shù)由ISO C定義。因?yàn)镮SO C不涉及多進(jìn)程、進(jìn)程組以及終 端I/O等,所以它對(duì)信號(hào)的定義非常含糊,以致于對(duì)UNIX系統(tǒng)而言幾乎 毫無(wú)用處。
從UNIX System V派生的實(shí)現(xiàn)支持signal函數(shù),但該函數(shù)提供舊的 不可靠信號(hào)語(yǔ)義(10.4節(jié)將說(shuō)明這些舊的語(yǔ)義)。提供此函數(shù)主要是為 了向后兼容要求此舊語(yǔ)義的應(yīng)用程序,新應(yīng)用程序不應(yīng)使用這些不可靠 信號(hào)。
4.4BSD 也提供 signal 函數(shù),但它是按照 sigaction 函數(shù)定義
所以在 4.4BSD 之下使用它提供 新的可靠信號(hào)語(yǔ)義。目前大多數(shù)系統(tǒng)遵循這種策略,但Solaris 10沿用 System V signal函數(shù)的語(yǔ)義。
signo參數(shù)是圖10-1中的信號(hào)名。func的值是常量SIG_IGN、常量 SIG_DFL或當(dāng)接到此信號(hào)后要調(diào)用的函數(shù)的地址。如果指定SIG_IGN, 則向內(nèi)核表示忽略此信號(hào)(記住有兩個(gè)信號(hào)SIGKILL和SIGSTOP不能忽略
當(dāng)指定函數(shù)地址時(shí),則在信號(hào)發(fā)生時(shí),調(diào) 用該函數(shù),我們稱這種處理為捕捉該信號(hào),稱此函數(shù)為信號(hào)處理程序 (signal handler)或信號(hào)捕捉函數(shù)(signal-catching function)。
#include <iostream>
#include <stdio.h>
#include <sys/signal.h>
#include <unistd.h>
void add(int x) {
std::cout << "use signal slover" << std::endl;
exit(0);
}
int main() {
/*----------------------------------- test signal ----------------------------------------*/
void (*f)(int x) = add;
signal(SIGINT, f);
for (int i = 0; i < 10; ++i) {
std::cout << "hello" << std::endl;
sleep(1);
}
return 0;
}
我們可以捕捉信號(hào)進(jìn)行處理,或者忽略信號(hào)
捕捉信號(hào)SIGTSTP
#include <iostream>
#include <stdio.h>
#include <sys/signal.h>
#include <unistd.h>
void add(int x) {
std::cout << "use signal slover" << std::endl;
std::cout << "catch SIGTSTP" << std::endl;
exit(0);
}
int main() {
/*----------------------------------- test signal ----------------------------------------*/
void (*f)(int x) = add;
signal(SIGTSTP, f);
for (int i = 0; i < 10; ++i) {
std::cout << "hello" << std::endl;
sleep(1);
}
return 0;
}
運(yùn)行時(shí)像進(jìn)程kill -TSTP pid或者輸入ctrl + z即可捕捉到
或者忽略指定信號(hào)(SIGKILL 和SIGSTOP不能忽略)