执行程序并将其杀死时发出信号和中断

时间:2016-03-21 18:22:18

标签: unix linux-kernel signals

我想更好地了解UNIX OS中的信号和中断机制。据我了解,中断用于CPU和OS内核之间的通信。信号用于在OS内核和OS进程之间进行通信。

我很难理解在某些情况下发生的事情,并找到正在调用的信号和中断以及何时。

例如,执行程序并使用kill pid将其终止时。在shell中键入程序名称时会触发哪些中断(例如pluma然后kill pluma_id)?

我在调用strace命令时尝试使用kill。执行的第一个命令是:execve ("/bin/kill", ["kill", "10057"], [/* 47 cars */]) = 0

据我所知,这是一个标准的系统调用,但我无法理解当键盘按键事件发生时触发了哪些中断以及发送了哪些信号。我也无法理解当使用kill系统调用被杀死时,哪些信号被发送到进程(可能根本没有发送?)。

以下场景中发生的完整事件序列(信号,剑麻和中断)是什么:

  1. 在shell中输入plume
  2. 点击回车键并执行pluma
  3. 执行kill pluma_id
  4. (简要描述绰绰有余,只是为了理解一般流程)

2 个答案:

答案 0 :(得分:2)

在shell中键入羽毛

发生键盘中断。 CPU接收键盘中断,执行处理程序,读取键码和扫描代码等。在/ dev / input / event *中生成的事件将由终端仿真器程序读取或将由您的转发到程序输入系统。您的桌面环境,Xserver等都参与其中。

按Enter键并执行pluma

与上述相同。收到回车键后,shell将fork()和exec()pluma。

执行kill pluma_id

Shell进程进行kill()系统调用。我的杀手手册说"杀人的默认信号是TERM。使用-l或-L列出可用信号"。进行系统调用时会有一个上下文切换。验证权限后,内核将找到指定进程ID的进程表条目。它将使用已接收到的信号编号更新PTE中进程的信号掩码。

因此,信号被传递给过程。现在该过程需要处理信号。如果它已为特定信号安装了信号处理程序,则会调用该处理程序。否则,内核将采用默认的handeler / action。在unix系统中,进程的信号处理通常在上下文切换期间发生,即,当进程切换回用户上下文或进程再次被调度时。

Maurice J. Bach对UNIX操作系统的设计对整个过程进行了非常简单而详细的解释。你可能想看看它。

答案 1 :(得分:1)

使用的kill(程序)下面是kill()系统调用,此系统调用始终将信号编号作为参数。

命令kill只是假定默认发送某些信号,例如:TERM信号。你看strace输出的是程序调用。您应该深入了解跟踪,并找到调用系统调用的位置。然后你会看到信号的数值。

您应该查看我认为的kill程序文档。如果您没有明确指定信号,它会提到默认情况下将哪个信号发送到进程。如果您愿意,它还会向您展示如何发送特定信号。