linux信号浅谈

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

设为 EINTR。

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

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

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

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

你可能感兴趣的:(linux信号浅谈)