CTRL^C 究竟如何传递信号进行处理

CTRL^C 究竟如何传递信号进行处理

我试图弄清楚 CTRL^C 到底如何将 SIGINT 发送到进程。让我们考虑一个伪终端系统。我会写下我所知道的(或者认为我知道的,哈哈),并请在需要的地方添加/替换:

球员是:

  • Xterm - 这是一个用户空间程序,它从键盘读取数据(使用 X 窗口系统)并将图片呈现到屏幕上。从键盘获得的每个字符都会传递到pty master.
  • 用户进程 - 作为终端的前台作业运行的用户进程。通常,当打开 Xterm 时,它会作为该用户进程运行 bash 或其他一些 shell 程序。
  • PTY 设备 - 这是用户进程连接到的字符设备,如其stdin, stdout, stderr。该进程写入的所有内容stdout均由 TTY 驱动程序及其线路规则进行处理,并作为输入传递到 maser 端,反之亦然。

一旦线路规则/TTY 驱动程序了解它应该向进程发送这样的信号,我现在不介意内核如何将信号传递给进程。我感兴趣的是,在我按下CTRL^Z键盘后,Xterm(这是读取此按键的过程)如何将此信息传递给pty master

编辑

感谢您的回答。欢迎您回复这个线程我实际上尝试通过写入 PTY 主设备来模拟这一点0x3,并查看从设备中发生了什么。你们能回应一下吗?

答案1

xterm只需将^C字符(ASCII 3)写入伪 tty 主设备,您可以轻松地使用它进行模拟script(另一个程序,就像 一样xterm,正在管理主伪 tty):

{ sleep 1; printf '\x03'; } | script -qc 'trap "echo SIGINT ma tuer; exit 1" I
NT; cat' /dev/null
^CSIGINT ma tuer

相关内容