APUE读书笔记(16) 信号(中)

一:可重入函数
  简单的来说,当一个进程捕捉到了信号,那么这个进程将会执行该信号处理程序中的指令,这个是绝对的。但是我们可能会想到一个问题,假设该进程正在执行一些比较特殊的指令,比如malloc;这时进程捕获到了一个信号,该信号处理程序执行也为malloc,那么会发生什么?这很有可能会对进程造成一个极为严重的影响,甚至直接杀死进程。
  那么由上可知,类似于malloc这种函数是【不可重入函数】,那么与之相对应的【可重入函数】相对而言就安全的多,他们如下所示:在这里插入图片描述
  【不可重入的函数】有以下的特定:
  1.他们使用静态的数据结构
  2.调用了malloc或者free函数
  3.他们是标准的I/O函数,因为这些函数的实现都已不可重入的方式使用了全局数据结构
  还有一点值得注意的是,即使我们信号处理的程序调用的是【可重入函数】,但是因为每个线程仅有一个【errno变量】,信号处理程序调用的函数可能会改变errno的值,所以,一般我们要在调用信号处理程序前保存errno的值,这是一个比较通用的规则。
二:可靠信号属于和语义
  当造成信号的事件发生的时候,会为进程产生一个信号。这个事件可以是硬件异常(除以零)、软件条件(alarm定时器超时)、终端产生的信号或者调用kill函数。当一个信号产生时,内核通常在进程表中以某种形式 设置一个标志。
  当信号采取了这种动作时,我们说向进程递送了一个信号。在信号产生和信号递送之间的时间间隔,我们称信号是【未决的】
  进程可以选用【阻塞信号递送】。如果为进程产生了一个阻塞的信号,而且对该信号的动作是系统默认动作或者捕捉该信号,则为该进程将信号保持为未决状态,知道该阻塞被解除,或者对此信号的动作更改为忽略。
  如果这种信号发生了多次,会如何处理?一般情况下只递送一次这个信号,除非支持POSIX.1实时扩展,否则大多数UNIX并不对信号排队。
  如果有多个信号同时发送了一个进程,正常是没有对信号的递送顺序做要求的,不过POSIX.1建议大家应当在其他信号之前递送与进程当前状态有关的信号。
  每个进程都有一个【信号屏蔽字】,可以理解为二进制的某一位代表一个信号的屏蔽字,但是信号的个数超过了整形能表示的64位,所以POSIX.1定义了一个新的数据类型sigset_t来容纳一个信号机
三:函数kill和raise
  kill函数可以将信号发送给进程或者进程组,raise函数可以发送信号给进程本身。
在这里插入图片描述
  raise(signo)等于kill(getpid(),signo)
  kill函数中的pid参数有四种情况
  1.pid>0,将信号发送给所有进程ID为pid的进程
  2.pid==0,将信号发送给与发送进程同属一个进程组的所有进程
  3.pid<0,将信号发送给进程组ID等于|pid|的所有进程组
  4.pid==-1,将信号发送给发送进程有权限发送的所有进程
四:信号集
  信号集就是刚才说的,能够代表所有信号的一个数据结构。对于信号集,有五个处理他的函数
在这里插入图片描述
  函数具体做的事情就不一一介绍了,总而言之就是各种对信号集做位运算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值