“杀人”如何运作?尤其是“杀戮”如何对被阻止的进程起作用?

时间:2009-07-10 04:12:59

标签: c linux operating-system kernel

内核中的人负责查杀进程。

如果出现“kill”,并且进程处于阻塞状态,该怎么办?是否等待直到进程运行状态才能清理自己。

如果有人可以在内核方面回答更多问题,比如生成kill命令的SIGINT,那么内核会调用所有内容,直到最后清除TCB(任务控制块)为止。

5 个答案:

答案 0 :(得分:7)

我认为你在谈论SIGKILL,所以我只会将讨论局限于那个信号。

当进程在另一个进程上引发SIGKILL时,SIGKILL将作为挂起信号添加到受害进程,并清除任何挂起的SIGSTOP,SIGTSTP,SIGTTOU或SIGTTIN信号。如果受害者停止或处于可中断的睡眠状态,受害者将被唤醒(可运行)。

当受害者进程接下来尝试从内核模式进入用户模式时,将检查待处理信号。这是找到挂起的SIGKILL的地方,内核调用do_exit()而不是返回用户模式。

从内核模式到用户模式的转换将是下次安排进程的时间(除非它处于不间断的睡眠状态 - 这是臭名昭着的D状态)。如果它处于不间断的睡眠状态,则该过程将不会尝试返回用户模式,直到它被唤醒。

答案 1 :(得分:5)

用SIGKILL以外的信号杀死它只会导致发送信号。这可以被屏蔽或忽略,但假设它不是(或在它被取消屏蔽之后),那么它会中断程序的正常运行。

如果正在进行IPC类型的系统调用(例如从套接字读取,select(),poll(),sleep()等),那么它将被中断并在errno中使用EINTR失败。正确编写的应用程序将在处理信号后重新发出呼叫。

然后,该进程立即执行对信号处理程序的调用,该函数可以返回以允许处理继续,或者它可以调用longjmp(在C中),或者它可以退出进程,这通常是默认的。

SIGKILL完全不同,以上都不会发生。相反,它只是退出系统调用(如果允许进程读取它,可能会将EINTR保留在errno中),然后导致任务立即退出而无法处理它。

但我认为其中任何一个都要等待“D”“不间断睡眠”状态才能完成。这通常类似于阻塞盘读取,页面错误需求加载等。

答案 2 :(得分:1)

运行kill只是向进程(TERM)发送一个信号,要求它终止。如果它不会回应那是它的业务。但是,您可以选择发送任何一个several different signals命令它消失。您可能感兴趣的是kill -9(SIGKILL)杀死它而不给它选择此事。

(编辑:正如评论中指出的那样,TERM是默认值)

答案 3 :(得分:0)

Killing(而不是中断)通常由UNIX系统中的SIGKILL信号执行(CTRL-C发送SIGINT)。

这些系统通常提供一种通过信号中断阻塞系统调用的方法,该方法允许信号处理程序执行而无需等待系统调用完成(这是EINTR错误发挥作用的地方)。所以通常,呼叫刚刚取消,无需等待它完成。

答案 4 :(得分:0)

每个进程都可以接收到许多类型的信号,它可以忽略处理这些信号,但是很少有信号没有传递到进程,但是“Proceess scheduler”会终止进程.... 看到这个更多解释 http://www.linux-tutorial.info/modules.php?name=MContent&pageid=289