似乎TASK_KILLABLE应该是TASK_INTERRUPTIBLE的一个子集,因为杀死一个任务是一种方式,嗯,打断它;但是,根据sched.h here和here,看起来TASK_KILLABLE是 UN INTERRUPTIBLE。
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_WAKEKILL 128
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
这对我来说真正归结为:我何时想使用wait_for_completion_interruptible_timeout与wait_for_completion_killable_timeout?
答案 0 :(得分:5)
原来,再多一点搜索为我解答了这个问题:article州引用的this somewhat related answer:
使用可中断睡眠的内核代码必须始终检查它是否因信号而醒来,如果是,请清理它正在做的事情并将-EINTR返回给用户空间。用户空间方面也必须意识到系统调用被中断并相应地做出响应;并非所有的用户空间程序员都因这方面的勤奋而着称。
和
如果应用程序即将被杀死,那么许多关于应用程序错误的问题并不适用。如果所述系统调用注定永远不会返回用户空间,那么开发人员是否考虑过中断系统调用的可能性并不重要。所以马修创造了一种新的睡眠状态,叫做TASK_KILLABLE;它的行为类似于TASK_UNINTERRUPTIBLE,但致命信号会中断睡眠