我目前对终端键盘信号的理解是(主要基于尝试将我的观察映射到可以在谷歌上找到的内容)如下:
在此之后它开始变得非常模糊,因为配置什么输入意味着在终端(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 启动一个包含两个进程的新进程组(它在其中执行foo并bar在将它们的 stdin/out 与管道连接之后)并将该组置于前台。如果您按下 Ctrl-C,两个进程都会收到 SIGINT。
在:
foo | bar &
Run Code Online (Sandbox Code Playgroud)
相同,但进程组未置于前台(并且 shell 也不等待它,因此您可以输入其他命令)。这些进程在 Ctrl-C 时不会获得 SIGINT,但如果它们尝试从 tty 设备读取,则可能会被挂起。
更多阅读:每个伪终端 (PTY) 组件(软件、主端、从端)的职责是什么?