signal.h头文件定义了一个变量类型sig_atomic_t、两个函数调用和一些宏来处理程序执行期间报告的不同信号。
库变量
库宏
SIG宏用于表示以下各种条件的信号码:
库函数
void (*signal(int sig, void (*func)(int)))(int):该函数设置一个函数来处理信号,即带有sig参数的信号处理程序。
参数
·sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
·func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
返回值
该函数返回信号处理程序之前的值,当发生错误时返回SIG_ERR。
实例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void sighandler(int);
int main()
{
signal(SIGINT, sighandler);
while(1)
{
printf("开始休眠一秒钟...\n");
sleep(1);
}
return(0);
}
void sighandler(int signum)
{
printf("捕获信号 %d,跳出...\n", signum);
exit(1);
}
让我们编译并运行上面的程序,这将产生以下结果,且程序会进入无限循环,需使用Ctrl+C键跳出程序。
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...
int raise(int sig):该函数会促使生产信号sig。sig参数和SIG宏兼容。
参数
·sig--要发送的信号码。下面是一些重要的标准信号常量:
返回值
如果成功该函数返回零,否则返回非零。
实例
#include <signal.h>
#include <stdio.h>
void signal_catchfunc(int);
int main()
{
int ret;
ret = signal(SIGINT, signal_catchfunc);
if( ret == SIG_ERR)
{
printf("错误:不能设置信号处理程序。\n");
exit(0);
}
printf("开始生成一个信号\n");
ret = raise(SIGINT);
if( ret !=0 )
{
printf("错误:不能生成 SIGINT 信号。\n");
exit(0);
}
printf("退出...\n");
return(0);
}
void signal_catchfunc(int signal)
{
printf("!! 信号捕获 !!\n");
}
让我们编译并运行上面的程序,这将产生以下结果:
开始生成一个信号
!! 信号捕获 !!
退出...
参考:
https://www.yuque.com/docs/share/6e9be628-3d3c-4dca-aa10-c710840bb4c9