信号以前都只是针对process进程来设计的,后续才把它加入到thread线程中。
信号的对象范围,一个是直接作用到进程,一个是直接作用到产生的线程。 比如SIGKILL作用范围是全进程,所以不管发往哪个线程,都会终止一个进程,类似的还有SIGSTOP。
当一个信号被发送到一个多线程的进程(不仅仅只是一个主线程)时,内核会选择该进程中的任意线程来处理该信号,这样做是保证不会出现一个信号被多次执行;当进程中有多个线程设置阻塞后,内核会选择其中一个没有阻塞的线程来进行处理,这里阻塞的线程其实即实现了与这些线程无关,避免被打扰。
所以当在多线程中,有信号处理的时候,为了避免信号干扰到本线程的敏感操作(read, send,recv等),一般会采取先阻塞信号,然后处理这些操作,最后放开阻塞,传递出信号,也可以设置系统忽略掉该信号。
信号的“未决”是一种状态,指的是从信号的产生到信号被处理前的这一段时间
阅读(1672) | 评论(0) | 转发(0) |