Unix 执行程序并终止程序时发出信号并中断

Unix 执行程序并终止程序时发出信号并中断,unix,linux-kernel,signals,Unix,Linux Kernel,Signals,我想更好地理解UNIX操作系统中的信号和中断机制。据我所知,中断用于CPU和操作系统内核之间的通信。信号用于操作系统内核和操作系统进程之间的通信 我很难理解在某些场景中发生了什么,找到调用哪些信号和中断以及何时调用 例如,当执行一个程序并使用kill-pid终止它时。在shell中键入程序名时会触发哪些中断(例如pluma然后kill pluma_id) 我尝试在调用kill命令时使用strace。执行的第一个命令是:execve(“/bin/kill”、[“kill”、“10057”]、[/*

我想更好地理解UNIX操作系统中的信号和中断机制。据我所知,中断用于CPU和操作系统内核之间的通信。信号用于操作系统内核和操作系统进程之间的通信

我很难理解在某些场景中发生了什么,找到调用哪些信号和中断以及何时调用

例如,当执行一个程序并使用
kill-pid
终止它时。在shell中键入程序名时会触发哪些中断(例如
pluma
然后
kill pluma_id

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

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

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

  • 在shell中键入
    羽流
  • 按回车键并执行
    pluma
  • 执行
    kill pluma\u id

  • (简明的描述就足够了,只是为了理解一般流程)

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

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


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

    在shell中键入羽流

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

    点击回车键并执行pluma

    同上。收到enter键后,shell将使用fork()和exec()命令

    执行kill pluma\u id

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

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

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