1,signal()
使用signal()函数处理时,只需指出要处理的信号和处理函数即可
sa_handler 是一个函数指针,指
sa_mask 是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被屏蔽,在调用信号捕获函数前,该信号集要加入到信号的信号屏蔽字中。
sa_flags 中包含了很多标志位,是对信号进行处理的各个选择项。它的常见可选值如下表所示:
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void signal_fun(int signo)
{
if(signo==SIGINT)
{
printf("I get a SIGINT\n");
}
else if (signo==SIGQUIT)
{
printf("I get a SIGQUIT\n");
}
}
int main()
{
printf("Waiting for signal to be sent......\n ");
signal(SIGINT,signal_fun);//第二个参数是函数的指针
signal(SIGQUIT,signal_fun);
pause();//将进程挂起来,等待信号的发送
exit(0);
}
addia@addia-Lenovo-B470:~/演示代码$ ./signal
Waiting for signal to be sent......
^\ I get a SIGQUIT
addia@addia-Lenovo-B470:~/演示代码$ ./signal
Waiting for signal to be sent......
^C I get a SIGINT
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void signal_fun(int signo)
{
if(signo==SIGINT)
{
printf("I get a SIGINT\n");
}
else if (signo==SIGQUIT)
{
printf("I get a SIGQUIT\n");
}
}
int main()
{
struct sigaction action;//定义结构体
printf("Waiting for signal to be sent......\n ");
//初始化
action.sa_handler=signal_fun;
sigemptyset(&action.sa_mask);
action.sa_flags=0;//相当于SA_NOMASK
<span style="background-color: rgb(255, 102, 0);">//action.sa_flags=SA_RESETHAND;</span>
sigaction(SIGINT,&action,0);
sigaction(SIGQUIT,&action,0);
printf("the first signal");
pause();//将进程挂起来,等待信号的发送
printf("the second signal");
pause();//将进程挂起来,等待信号的发送
exit(0);
}
/* sigset.c */
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
/*自定义的信号处理函数*/
void my_func(int signum)
{
printf("If you want to quit,please try SIGQUIT\n");
}
int main()
{
sigset_t set,pendset;/*定义信号集*/
struct sigaction action1,action2;
/*初始化信号集为空*/
if(sigemptyset(&set)<0)
{ /*void perror(const char *s);功能:用来将上一个*/
perror("sigemptyset"); /*函数发生错误的原因输出标准设备(stderr),参数s*/
exit(1); /*所指的字符串会先打印出,后面再加上错误原因字符串*/
} /*此错误原因依照全局变量errno的值来决定要输出的字符串*/
/*将相应的信号加入信号集*/
if(sigaddset(&set,SIGQUIT)<0)
{
perror("sigaddset");
exit(1);
}
if(sigaddset(&set,SIGINT)<0)
{
perror("sigaddset");
exit(1);
}
/*查询SIGINT信号是否在信号集中*/
if(sigismember(&set,SIGINT))/*成功返回1*/
{
/*sigaction结构初始化*/
sigemptyset(&action1.sa_mask);
action1.sa_handler=my_func;
action1.sa_flags=0;
/*等待发出相应的信号,并跳转到信号处理函数处*/
sigaction(SIGINT,&action1,NULL);
}
if(sigismember(&set,SIGQUIT))
{
sigemptyset(&action2.sa_mask);
action2.sa_handler=SIG_DFL;/*采用系统默认方式处理该信号*/
action2.sa_flags=0;
sigaction(SIGQUIT,&action2,NULL);
}
/*设置信号屏蔽字,此时set中的信号不会被传递给进程,暂时进入待处理状态*/
if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
{
perror("sigprocmask");
exit(1);
}
else
{
printf("Signal set was blocked,Press any key!");
getchar(); /*这就是输入任意键的关键,你不输入任意键,程序就一直停在这里*/
}
/*在信号屏蔽字中删除 set 中的信号*/
if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0)
{
perror("sigprocmask");
exit(1);
}
else
{
printf("Signal set is in unblock state\n");
}
while(1);
exit(0);
}/*end*/
addia@addia-Lenovo-B470:~/演示代码$ ./sig
Signal set was blocked,Press any key!^[[A
Signal set is in unblock state
^CIf you want to quit,please try SIGQUIT
^\退出 (核心已转储)
addia@addia-Lenovo-B470:~/演示代码$ ./sig
Signal set was blocked,Press any key!^[[A
Signal set is in unblock state
^\退出 (核心已转储)
参考来自:blog.csdn.net/mybelief321/article/details/9079145