信号处理对进程执行的影响

转自:https://www.cnblogs.com/Carrie-0173/p/6394533.html

当要处理信号捕捉问题时,我们可以为某一信号设置自定义的信号处理函数,这个信号处理函数会对正在执行的进程有怎样的影响?

一、对进程执行的干预:

1.当信号被捕捉时,进程正在执行用户态程序指令,(即用户自行编写的代码 或 库程序代码):

  此种情况下,进程正执行的代码将被暂停,转而去执行信号处理函数。只要信号处理函数中 不 exit()终止当前进程 或 用longjmp跳转到别的地方,那么当信号处理函数执行完成后,进程将继续从被信号中断处开始执行。

2.当信号被捕捉时,进程正在执行核心态代码,(系统调用-内核代码):

  此时,除非系统调用结束,或者 调用了sleep原语进行睡眠(且非快速I/O的短暂睡眠)让出CPU时,信号处理函数才可执行,否则信号处理函数无法打断进程当时的执行。

二、易导致的问题

当信号处理函数打断了进程当时的代码执行,进行了其它的操作,这很容易导致代码重入的问题,尤其对那些依赖全局或静态数据结构的算法操作影响很大。

  比如:

  char *strtok(char *string,char *token)函数,用于根据给定的分解符token,从给定的字符串string中分出一个单词。返回指向单词的首字符指针。

  当第一个参数为NULL时,strtok函数将在上一次执行该函数结束的位置(第一个被分出的单词的尾部)继续寻找下一个单词。

这个功能是根据strtok函数内部使用了静态变量记录了上次的结束位置。

  如果strtok函数当第一个参数为NULL时的执行被信号处理函数中止,而且信号处理函数中也使用了strtok函数,那么当进程返回到被中断前的strtok函数执行时,就会出现错误,因为依赖的全局变量被改变了。

 

信号处理函数带来的代码重入问题,在调试中很困难,因为信号到达时间是有一定随机性的(不好控制),所以错误重现很困难。所以我们在编程时,尽量不要用信号机制实现过分复杂的功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程信号处理过程:(1)在目的进程中安装该信号,即设置如果目标进程捕获该信号执行的操作代码。Linux采用sigal和sgation系统调用来完成。因信号是异步事件的典型应用,产生信号进程而言是随机出现的,因此,进程不能预先知道信号会不会发送到当前进程,也不能预先知道信号什么时候发送到当前进程,因此只能在信号到来前告诉内核“在此信号发生时,请执行下列操作”,即所谓的安装信号。 (2)信号被某个进程产生,同时设置此信号的目标进程(一般为目标进程的pid),然后由操作系统管理。Linux采用kill()、arise()、alarm()等系统调用来实现。 (3)信号在目的进程被注册。操作系统将信号添加到目的进程的PCB相关的数据结构中。在每个进程的PCB (task_struct结构)中有一个未决信号的数据成员。 (3)信号进程中的注销。进程执行信号相应处理函数之前,首先要把信号进程中注销。如果存在未决信号等待处理且该信号没有被进程屏蔽,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉。 (5)信号生命终止。进程注销信号后,目的进程根据当前进程对此信号设置的处理方式,暂时终止当前代码的执行,保护上下文,转而执行信号处理函数,即捕获该信号执行完成后再恢复到被中断的位置继续执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值