信号、信号集、信号掩码、信号处理

一、信号: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函数只能用于单线程,在多线程环境下需要使用其它函数。

四、信号处理:


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值