一个进程收到一个信号的时候,可以用如下方法进行处理:
- 执行系统默认动作
对大多数信号来说,系统默认动作是用来终止该进程。 - 忽略此信号(丢弃)
接收到此信号后没有任何动作。 - 执行自定义信号处理函数(捕获)
用用户定义的信号处理函数处理该信号。
【注意】:SIGKILL 和 SIGSTOP 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法。
sigaction函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
void func(int signo)
{
printf("捕捉到信号 %d\n",signo);
}
int main()
{
int ret=-1;
struct sigaction act;
//使用旧的信号处理函数指针
act.sa_handler=fun;
//标志位默认 默认使用旧的信号处理函数指针
act.as_flags=0;
//信号注册
ret=sigaction(SIGINT,&act,NULL);
if(-1 == ret)
{
perror("sigaction");
return 1;
}
printf("按下任意键退出,,,\n");
while(1)
{
getchar();
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
void func1(int signo,siginfo_t* info,void* context)
{
printf("捕捉到信号 %d\n",signo);
}
int main()
{
int ret=-1;
struct sigaction act;
//使用新的信号处理函数指针
act.sa_handler=fun1;
//标志指定使用新的处理函数指针
act.sa_flags=SA_SIGINFO;
//信号注册
ret=sigaction(SIGINT,&act,NULL);
if(-1 == ret)
{
perror("sigaction");
return 1;
}
printf("按下任意键退出,,,\n");
while(1)
{
getchar();
}
}
效果和上面一样
如果上传少量信息,用新的
不带信息,用旧的
尽量使用sigaction函数!!!