谁决定哪个应用程序接收来自键盘的信号?

cal*_*nfo 17 terminal signals

我目前对终端键盘信号的理解是(主要基于尝试将我的观察映射到可以在谷歌上找到的内容)如下:

  • 用户按抄送
  • 这作为一个字节发送到终端的输入缓冲区,该字节是通过从 c 的 7 位 ascii 值中清除 2 个最左边的位来计算的

在此之后它开始变得非常模糊,因为配置什么输入意味着在终端(stty)中完成什么信号。我想这意味着终端本身正在向进程发送信号。但我也认为该终端不知道正在读取它的应用程序。

在终端中通过键盘发送信号如何从头到尾工作?

Sté*_*las 34

按下C同时Ctrl按下会向终端仿真器发送一个按键,然后是按键释放 X11 事件。

在发生该事件(通常是按键事件)时,终端仿真器将 0x3 字节 ( ^C) 写入其伪 tty 设备主端的文件描述符。

如果设备的isigtermios 设置打开并且该intr设置设置为 0x3 字节,则内核将 SIGINT 信号发送到终端设备的前台进程组的所有成员(存储在 pty 设备中的另一个属性)。在这种情况下,0x3 字节将无法在 pty 的从端读取。

它通常是交互式 shell,它setpgid()为 shell 作业创建进程组(使用),并决定将哪个放在前台(tcsetpgrp()用于设置 pty 设备的该属性)。

例如,当您在交互式 shell 的提示下运行时:

foo | bar
Run Code Online (Sandbox Code Playgroud)

shell 启动一个包含两个进程的新进程组(它在其中执行foobar在将它们的 stdin/out 与管道连接之后)并将该组置于前台。如果您按下 Ctrl-C,两个进程都会收到 SIGINT。

在:

foo | bar &
Run Code Online (Sandbox Code Playgroud)

相同,但进程组未置于前台(并且 shell 也不等待它,因此您可以输入其他命令)。这些进程在 Ctrl-C 时不会获得 SIGINT,但如果它们尝试从 tty 设备读取,则可能会被挂起。

更多阅读:每个伪终端 (PTY) 组件(软件、主端、从端)的职责是什么?

  • 感谢丰富的回答。我将尝试重新表述答案的核心,以确保我理解它:信号由内核发送,内核正在监视 tty 设备本身以获取在设备属性中配置的输入(由想要配置它的任何人)内核将其发送到进程组,该进程组也在设备属性中配置(主要由 shell 作为会话领导者的职责之一)。我希望这是正确的。 (2认同)
  • @Toby,是的,因为现在几乎没有人使用真正的终端,我认为 OP 意味着终端模拟器(其中许多被称为“终端”)。另请参阅我上面的评论和链接的问答以了解更多详细信息。 (2认同)