一、signal()信号的功能
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件,在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求是一样的。
二、使用
添加头文件#include <signal.h>
下面是函数原型,第一个是信号处理回调函数,第二个是signal函数的原型
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
三、参数解读
函数原型:sighandler_t signal(int signum, sighandler_t handler);
第一个参数signum:所要处理的信号类型,它可以是除了SIGKILL和SIGSTOP外的任何一种信号。
第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:
1、SIG_IGN 表示忽略该信号。
例
//验证SIG_IGN
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
int main()
{
int i=0;
signal(SIGINT,SIG_IGN);//SIGINT是ctl c发起的信号
//SIG_IGN表示忽略接收到的信号,这时信号是不执行的
for(i=0;i<10;++i)//执行10秒
{
printf("ignore the signal:%d\n",i);
sleep(1);
}
return 0;
}
2、SIG_DFL 表示恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作。
例:
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[])
{
signal(SIGINT, SIG_DFL);
for(i=0;i<10;++i)//执行10秒
{
printf("ignore the signal:%d\n",i);
sleep(1);
}
return 0;
}
3、sighandler_t类型的回调函数指针
函数的声明
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
例:
#include <stdio.h>
#include <signal.h>
#include <unistd.h> //使用usleep必须添加的头文件
static bool canExit = false;
void sigroutine(int dunno)
{
switch (dunno)
{
case SIGUSR1:
CLog::debug("Get a signal -- SIGUSR1\n");
canExit = true;
break;
case SIGHUP:
CLog::debug("Get a signal -- SIGHUP\n");
canExit = true;
break;
case SIGINT:
CLog::debug("Get a signal -- SIGINT\n");
canExit = true;
break;
case SIGTERM:
canExit = true;
CLog::debug("Get a signal -- SIGTERM\n");
break;
}
}
int main(int argc, char *argv[])
{
signal(SIGINT, sigroutine); //接收到信号,就会调用sigroutine函数
signal(SIGUSR1, sigroutine);
while(!canExit )
usleep(500 * 1000);
}
这个例子就是用来接收某个信号,来结束主线程,然后直接退出进程