TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE 的区别
TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。
而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。
信号本质
信号是在软件层次上对中断机制的一种模拟,软中断
信号来源
信号事件的发生有两个来源:
硬件来源:(比如我们按下了键盘或者其它硬件故障);
软件来源:最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。
区分是什么原因唤醒进程,用如下:
if (signal_pending(current)) { retval = -ERESTARTSYS; break; }
检查当前进程是否有信号发生,返回不为0表示有信号需要处理。-ERESTARTSYS 表示信号处理函数执行完毕后重新执行信号处理函数前的某个系统调用。也就是说,如果信号发生前有发生系统调用,在执行信号处理函数之前,内核会检查系统调用的返回值,看看是不是因为这个信号而中断了系统调用,如果返回值是-ERESTARTSYS,并且当前调度的信号具备-ERESTARTSYS属性,系统就会在信号处理函数返回之后再执行该系统调用。