unix信号处理函数 signal (1)

 信号是unix处理异步事件的经典方法。产生信号的方法一般有:

  用户按中断键、硬件异常信号、软件异常信号、用户的kill命令等。系统也可以有多种方式处理这些异步事件,比如:忽略信号、捕捉信号或者执行默认动作。

  大多数unix程序都是用信core文件来检查进程终止时候的状态的。core文件就是对于该文件的进程存储映像进行复制。unix环境高级编程里累赘的提了几种不产生core文件的情况,不在说了。signal信号的函数如下:

   void (*signal)(int signo,void (*func)(int)))(int);

 

   简单的表示,也可以这样写:

   typedef  void Sigfunc(int);

   Sigfunc *signal(int,Sigfunc*);

 

   一目了然。其中 ,Sigfunc可以认为是信号处理程序的回调函数。

   一定要记住这两种情况:

   1)当进程启动的时候,所有信号的状态就是系统默认或者忽略。除非调用exec动作。

     因为exec动作,将原先设置为要捕捉的信号为默认动作,道理很简单,就是exec要用新的进程地址空间覆盖旧的,自然原先的信号就已经被屏蔽了。

   2)开启一个子进程的时候,子进程继承父进程的信号处理方式。因为子进程一开始启动就复制了父进程的存储映像,信号捕捉函数地址在父子进程中都是有意义的。

 

 

  

   signal的信号处理方式带有好多的缺陷,比如,在产生信号和调用signal信号处理程序之间有一个时间窗口,如果再来一个信号可能丢失。等等。

   在执行慢速的系统调用的时候,进程很可能阻塞几个小时或者数天,如果进程在执行一个低速系统调用期间捕捉到一个信号的时候,那么该系统调用就被中断不在继续执行。因为一个信号发生了,这就意味着发生了某种事情,所以这是唤醒被阻塞的进程的好机会。

   为了帮助应用进程不必处理被总段的系统调用,linux系统引入了某些被中断系统调用的自动重启函数,包括:Ioctl,read,readv,write,writev,wait和waitpid。前5个只对低速设备调用才有效,而后两个只对捕捉到进程退出信号时才有效。可重入函数主要用于多任务环境中,一个函数是可重入与否,简单的说就是否可以被中断。假如一个链表,如果被中断则会发生莫名的错误,其执行序列是不可预测的。

    信号发生的时候到递送之间的时间间隔,我们称为信号时未决的。在未决的信号期间,如果我们阻塞了某些信号,那么,即使我们产生信号,这些都会被阻塞。除非等解除阻塞以后,系统才会处理这些信号。而且,阻塞期间多次产生的同一个信号,解除阻塞后,系统处理且只处理一次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值