执行程序并杀死它时的信号和中断
我想更好地理解UNIX操作系统中的信号和中断机制。据我了解,中断用于CPU和操作系统内核之间的通信。信号用于在OS内核和OS进程之间进行通信。执行程序并杀死它时的信号和中断
我很难理解在某些情况下发生了什么,并且发现哪些信号和中断正在被调用以及何时发生。
例如,执行程序并使用kill pid
将其杀死时。在shell中输入程序的名称时会触发哪些中断(例如pluma
,然后是kill pluma_id
)?
我试过在调用kill
命令时使用strace
。执行的第一个命令是:execve ("/bin/kill", ["kill", "10057"], [/* 47 cars */]) = 0
据我所知,这是一个标准的系统调用,但我无法理解哪些中断被触发,哪些信号在发生键盘按键事件时发送。我也无法理解哪些信号在使用kill
系统调用终止时被发送到进程(可能根本没有发送?)。
什么是发生在以下情形事件(信号,sisals和中断)的全序列:
- 在shell中键入
plume
- 点击回车键执行
pluma
- 执行
kill pluma_id
(简要说明绰绰有余,只是了解一般流程)
打字羽在外壳发生
键盘中断。 CPU接收键盘中断,执行处理程序,读取键码和扫描代码等。/ dev/input/event *中生成的事件将由终端仿真器程序读取,或将由您的程序转发给程序输入系统。涉及您的桌面环境,Xserver等。
击中输入键和执行pluma
同上。在收到输入密钥后,shell将fork()和exec()pluma。
执行杀pluma_id
壳牌工艺使得杀灭()系统调用。我的kill手册中提到“kill的默认信号是TERM,使用-l或-L列出可用信号”。进行系统调用时会有上下文切换。核实权限后,内核会找到指定进程ID的进程表条目。它将更新信号编号pluma收到的PTE过程的信号掩码。
因此信号被传递给过程。现在该过程需要处理信号。如果它为特定的信号安装了一个信号处理程序,处理程序会被调用。否则内核会采用默认的handeler/action。在unix系统中,进程的信号处理通常发生在上下文切换期间,即当进程切换回用户上下文或再次调度进程时。
Maurice J. Bach设计的UNIX操作系统对整个过程进行了非常简单和详细的说明。你可能想看看它。
使用的kill
(该程序)下面是一个kill()
系统调用,并且此系统调用总是获取一个信号编号作为参数。
命令kill
只是假定某些信号是默认发送的,例如:TERM
信号。你看strace
输出是程序调用。您应该更深入地了解跟踪,并找到系统调用的调用方式。然后你会看到信号的数值。
你应该看看我认为的kill
程序文档。它提到了默认情况下发送给进程的信号,如果你没有明确指定信号的话。如果您愿意,它还会告诉您如何发送特定信号。