udodoo 发表于 2014-12-29 21:49

super皮波 发表于 2014-12-30 10:01

你指的pending是什么状态,进程的状态没有pending这一说

udodoo 发表于 2014-12-30 22:05

super皮波 发表于 2014-12-31 09:51

书上说的pending就相当于等待某个条件的意思,实际上进程的状态没有pending状态,这时3.10内核上进程的所有状态,书上说的pending就是如下标红的进程state
可以被信号打断的睡眠
#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

super皮波 发表于 2014-12-31 10:00

应该这样说,对于scanf来说,pending就应该是指的#define TASK_INTERRUPTIBLE      1

fendounav 发表于 2015-01-02 19:36

引自《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]
查看完整版本: [结贴]为什么scanf使得进程处于Sleep状态而不是Pending状态?