可以被信号打断的睡眠
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
#define TASK_PARKED 512
#define TASK_STATE_MAX 1024 应该这样说,对于scanf来说,pending就应该是指的#define TASK_INTERRUPTIBLE 1 引自《Linux内核设计与实现(原书第三版)》:
进程描述符中的state域描述了进程的当前状态。系统中的每个进程都必然处于五种进程状态中的一种。该域的值也必为下列五种状态标志之一:
TASK_RUNNING(运行):进程是可执行的;它或者正在执行,或者在运行队列中等待执行。这事进程在用户空间中执行的唯一可能的状态,这种状态也可以应用到内核空间中正在执行的进程。
TASK_INTERRUPTIBLE(可中断):进程正在睡眠(也就是说它正在被阻塞),等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为TASK_RUNNING。处于此状态的进程也会因为接收到信号而提前被**并随时准备投入运行。
TASK_UNINTERRUPTIBLE(不可中断):出了就算是接收到信号也不会被**或投入运行外,这个状态与TASK_INTERRUPTIBLE相同。这个状态通常在进程必须在等待时不受干扰或等待事件很快就会发生时出现。由于此状态的任务队信号不做响应,所以较之TASK_INTERRUPTIBLE状态,使用的较少。
_TASK_TRACED:被其他进程跟踪的进程,例如通过ptrace对调试程序进行跟踪。
_TASK_STOPPED(停止):进程停止执行;进程没有投入运行也不能投入运行。通常这种状态发生在接收到SIGSTOP、SIGTSTP、SIGTTIN,SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。
我理解TASK_RUNNING(运行)状态下:进程正在执行或者当前只等待CPU资源。而TASK_INTERRUPTIBLE(可中断)和TASK_UNINTERRUPTIBLE(不可中断)状态下:进程正在等待除CPU外的其他系统资源或条件。
楼上正解,pending就应该是指的#define TASK_INTERRUPTIBLE 1。
页:
[1]