Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 任务“;垂死“;使用SIGKILL进行不间断系统调用期间的状态_C_Linux_Linux Kernel_Signals_System Calls - Fatal编程技术网

C 任务“;垂死“;使用SIGKILL进行不间断系统调用期间的状态

C 任务“;垂死“;使用SIGKILL进行不间断系统调用期间的状态,c,linux,linux-kernel,signals,system-calls,C,Linux,Linux Kernel,Signals,System Calls,我阅读了关于SIGKILL的文章,对以下陈述感到困惑: 只有一些系统调用是可中断的,因此内核在内部 将进程标记为处于特殊的“死亡”状态,直到系统停止 调用或I/O操作已解决 一旦解析了任何进程内内核例程,进程状态将为 从“死亡”变为“死亡”,内核开始清理它 但我在内核源代码中找不到对此的任何确认。任务状态定义如下: linux/sched.h和其他调度程序文件中都没有任何“死亡”状态。有人能澄清一下,在不可中断系统调用时,哪个任务状态用于将任务标记为“正在死亡”吗?从对的回答来看,“正在死亡”

我阅读了关于SIGKILL的文章,对以下陈述感到困惑:

只有一些系统调用是可中断的,因此内核在内部 将进程标记为处于特殊的“死亡”状态,直到系统停止 调用或I/O操作已解决

一旦解析了任何进程内内核例程,进程状态将为 从“死亡”变为“死亡”,内核开始清理它

但我在内核源代码中找不到对此的任何确认。任务状态定义如下:

linux/sched.h和其他调度程序文件中都没有任何“死亡”状态。有人能澄清一下,在不可中断系统调用时,哪个任务状态用于将任务标记为“正在死亡”吗?

从对的回答来看,“正在死亡”状态似乎对应于“不可中断睡眠”状态:

如OP评论中所述,
D
的进程状态(
STAT
)表示进程处于“不间断睡眠”状态。在现实世界中,这通常意味着它正在等待I/O,在I/O操作完成之前,它不能/不会做任何事情,包括死亡

linux/sched.h
中的状态之外,似乎
TASK\u unterruptible
是与不间断睡眠状态相对应的状态。来自(约格什·巴巴尔):

不间断睡眠状态是指不能立即处理信号的状态。只有在等待资源可用时,或者在等待期间发生超时(如果在进程进入睡眠状态时指定了超时),它才会被唤醒。不间断状态主要由等待磁盘或网络I/O的设备驱动程序使用。当进程处于不间断睡眠状态时,当进程从系统调用或陷阱返回时,会注意到在睡眠过程中积累的信号。在Linux系统中。命令ps-l使用状态字段中的字母D表示进程处于不间断睡眠状态。在这种情况下,进程状态标志设置如下:

p->state=TASK\u不间断

#define TASK_RUNNING            0x0000
#define TASK_INTERRUPTIBLE      0x0001
#define TASK_UNINTERRUPTIBLE    0x0002
#define __TASK_STOPPED          0x0004
#define __TASK_TRACED           0x0008
/* Used in tsk->exit_state: */
#define EXIT_DEAD               0x0010
#define EXIT_ZOMBIE             0x0020
#define EXIT_TRACE              (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_PARKED             0x0040
#define TASK_DEAD               0x0080
#define TASK_WAKEKILL           0x0100
#define TASK_WAKING             0x0200
#define TASK_NOLOAD             0x0400
#define TASK_NEW                0x0800
#define TASK_STATE_MAX          0x1000