linux信号浅谈
linux信号浅谈
天下杰论 发表于5年前
linux信号浅谈
  • 发表于 5年前
  • 阅读 34
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

当一个进程正在执行一个系统调用时,如果向该进程发送一个信号,那么对于大多数
系统调用来说,这个信号在系统调用完成之前将不起作用,因为这些系统调用不能被信号
打断。但是有少数几个系统调用能被信号打断,例如:wait(),pause()以及对慢速设备(终端、
打印机等)的 read()、write()、open()等。如果一个系统调用被打断,它就返回-1,并将 errno

设为 EINTR。

在 Linux 中,当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信
号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用
相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中
断。

而且如果两个信号同时产生,系统并不保证进程接收它们的次序。以上的两个缺点影
响了信号作为进程通信手段的可靠性,因为一个进程不能保证它发出的信号不被丢失。
当某个信号未被处理的时候,如果对该信号执行 signal 调用,那么该信号将被注销。

一个进程通过对 signal()的调用来处理其它进程发送来的信号。同时,一个进程也可以
向其它的进程发送信号。这一操作是由系统调用 kill()来完成的。

需要说明的是,一个进程并不是向任何进程均能发送信号的,这里有一个限制,就是
普通用户的进程只能向具有与其相同的用户标识符的进程发送信号。也就是说,一个用户
的进程不能向另一个用户的进程发送信号。只有 root 用户的进程能够给任何线程发送信号。

共有 人打赏支持
粉丝 53
博文 392
码字总数 23359
×
天下杰论
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: