信号

信号
一 简述
每个信号都有一个名字,这些名字都以三个字符SIG开头。在头文件<signal.h>中,这些信号都被定义为正整数(信号编号)。 当对信号采取了这种动作时,我们说向进程递送了一个信号。在信号产生和递送之间的时间间隔内,称信号是未决的。进程可以选用信号递送阻塞。进程调用sigpending函数来判定那些信号是设置为阻塞并处于未决状态的。 每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。对于每种可能的信号,该屏蔽字中都有一位与之对应。对于某种信号,若其对应位已设置,则它当前是被阻塞的。进程可以调用sigprocmask来检测和更改其当前信号屏蔽字。
不存在编号为0的信号,posix将此种信号编号值称为空信号。
信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能简单地测试一个变量来判别是否出现了一个信号,而是必须告诉内核当信号出现时应当如何处理。可以要求内核在某个信号出现时按照下列三种方式之一进行处理:
1.忽略此信号。
2.捕捉信号。
3.执行系统默认动作。
二  signal函数
说明:
1.此函数需要两个参数,返回一个函数指针,而该指针所指向的函数无返回值。第一个参数signo是一个整数,第二个参数是函数指针,他所指向的函数需要一个整型参数,无返回值。该函数的返回值是一个函数地址,该函数有一个整型参数。
2.signo参数就是信号名。
3.func的值是常量SIG_IGN  SIG_DFL或当接到此信号后要调用的函数地址。如果指定SIG_IGN,则向内核表示忽略此信号(记住有两个信号SIGKILL 和 SIGSTOP不能忽略)。如果指定SIG_DFL,则表示接到此信号后的动作是系统默认动作。当指定函数地址时,则在信号发生时,调用该函数,我们称这种处理为“捕捉”该信号。称此函数为信号处理程序或信号捕捉函数。
三  信号集
posix.1定义了数据类型sigset_t以包含一个信号集,并且定义了下列五个处理信号集的函数:
  说明:sigemptyset初始化由set指向的信号集,清除其中所有信号(将所有位设为0)。sigfillset初始化由set指向的信号集,使其包括所有信号(将所有位设为1)。sigaddset将一个信号添加到现有集合中,sigdelset则从信号集中删除一个信号。

sigprocmask
#include   <signal.h>
int     sigprocmask(int    how, const    sigset_t    *restrict    set,  sigset_t    *restrict    oset );
返回值:若成功则返回0,若出错则返回-1
说明:
1.若oset是非空指针,那么进程的当前信号屏蔽字通过oset返回。
2.若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。 如下图:
  SIG_BLOCK是“或”操作,而SIG_SETMASK则是赋值操作。注意,不能阻塞SIGKILL和SIGSTOP信号。如果set是空指针,则不改变该进程的信号屏蔽字,how的值也毫无意义。

3. sigprocmask是仅为单线程的进程定义的,处理多线程的进程中的信号的屏蔽,提供了另一个单独的函数,这在线程那里会对这个函数进行描述。

sigpending函数
#include    <signal.h>
int    sigpending(sigset_t    *set);
返回值:若成功则返回0,若出错则返回-1
说明:sigpending函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能递送,因而也一定是当前未决的。该信号集通过set参数返回。

sigaction函数
#include    <signal.h>
int    sigaction(int    signo, const    struct   sigaction    *restrict    act,  struct    sigaction   *restrict   oact);
返回值:若成功则返回0,若出错则返回-1
说明:
1.sigaction函数的功能是检查或修改与指定信号相关联的处理动作(或同时执行这两种操作)。
2.参数signo是要检测或修改其具体动作的信号编号。若act指针非空,则要修改其动作。如果oact指针非空,则系统经由oact指针返回该信号的上一个动作。此函数使用下列结构:
           当更改信号动作时,如果sa_handler字段包含一个信号捕捉函数的地址(与常量SIG_IGN或SIG_DFL相对),则sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加到进程的信号屏蔽字中。

sigsetjmp 和 siglongjmp函数
posix.1并没有说明setjmp和longjmp对信号屏蔽字的作用,而是定义了两个新函数sigsetjmp 和 siglongjmp。在信号处理程序中进行非局部转移时应当使用这两个函数。
  说明:这两个函数与setjmp和longjmp之间的唯一区别是sigsetjmp增加了一个参数。如果savemask非0,则sigsetjmp在env中保存进程的当前信号屏蔽字。调用siglongjmp时,如果带非0,savemask的sigsetjmp调用已经保存了env,则siglongjmp从其中恢复保存的信号屏蔽字。

sigsuspend函数
  说明:将进程的信号屏蔽字设置为由sigmask指向的值。

四 kill和raise函数
  说明:kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值