一、信号:1.信号的概念:信号时发给进程的特殊消息,当进程收到信号后立刻中断当前正在执行的代码,转而开始处理该信号。
2.三种信号的处理方式 :A、忽略信号:对于大多数信号都可以忽略,除了SIGKILL和SIGSTOP。
B、默认处理:每个信号都有默认处理,而每个信号默认处理就是终止程序。
c、捕获信号:为了捕获信号,应用必须定义自己的信号处理函数,并向系统进行注册,当信号发生后,系统将调用应用自身的 信 号处理程序。
二、信号集:信号集代表多个信号构成的集合,类型为sigset_t。通过设置相关信号集,应用程序就能使用sigprocemask函数通知内核屏蔽信号集中的所有信号,从而保证应用在执行某段代码时不被信号打断。
信号集的操作函数为:#include<signal.h>
int sigemptyset(sigset_t *set);//初始化一个信号集set,既集合里面不包含任何设置的信号
int sigfillset(sigset_t *set);//在信号集中注册所有信号
int sigaddset(sigset_t *set, int signo);//在信号集合中增加一个信号
int sigdelset(sigset_t *set, int signo);//在信号集合中删除一个信号
int sigismember(const sigset_t *set,int signo);//判断一个信号是否在集合中
返回值:0代表成功,-1代表失败,错误代码为EINVAL。
这五个函数的参数set都代表信号集指针,参数signo代表要操作的新号。
下面这段代码说明了怎样向信号集sigs中添加SIGINT和SIGQUIT:
sigset_t sigs;
if(sigempty(&sigs)==-1)||(sigaddset(&sigs,SIGINT)==-1)||(sigaddset(&sigs,SIGQIUT)==-1))
perror("Failed to set up signal mask");
三、信号掩码:1.概念:每个进程都有一个信号的掩码,q其中定义了当前进程要求的阻塞的信号集。
2.进程可以通过sigprocmask函数对其信号掩码进行查看 、更改或者同时完成这两个操作。
#include<signal.h>
int sigprocmask(int how,const sigset_t *restrict set ,sigset_t *rstrict oset);
返回值:0代表成功,-1代表失败,错误掩码为EINVAL。
3个参数分别为:(1)oset,若其为空,则当前进程的信号掩码将通过oset返回。
(2)set,用于设置的信号集合。
(3)how,指明如何根据非空的set参数来修改当前进程的信号掩码:SIG_BLOCK,将信号集合set添加到当前被阻塞的信号集合 中:SIG_UNBLOCK,从当前被阻塞的信号集中删除信号set:SIG_SETMASK,设置当前被阻塞的信号集合为指定的set.
(4)另外,若set为空,则不对进程的当前信号掩码进行修改并忽略how参数。要注意的是,sigprocmask函数只能用于单线程,在多线程环境下需要使用其它函数。
四、信号处理: