![CTRL^C 究竟如何传递信号进行处理](https://linux22.com/image/186652/CTRL%5EC%20%E7%A9%B6%E7%AB%9F%E5%A6%82%E4%BD%95%E4%BC%A0%E9%80%92%E4%BF%A1%E5%8F%B7%E8%BF%9B%E8%A1%8C%E5%A4%84%E7%90%86.png)
我试图弄清楚 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