参考资料
1.Linux内核完全注释 v5.0修正版
实验环境
bochs模拟x86硬件平台下的Linux0.12操作系统
实验环境地址:http://www.oldlinux.org/Linux.old/bochs/ ,该路径下选择一个Linux0.12版本就可进行实验。
处理流程
我们知道通过键盘^C等控制符号是可以向当前tty进程组的前台进程发送信号的,而其处理过程如下:
该图引用“Linux内核完全注释 v5.0修正版“
当我们在键盘按下Ctrl+C键后,会触发keyboard.S中的键盘中断处理函数,在键盘中断处理函数中会进行转换得到控制码,控制码如下:
0,1列就是控制码,当按下Ctrl+(4,5列字符)就会得到对应的0,1列控制码。例如Ctrl+C->ETX,Ctrl+P->DLE依次类推。
控制码最后会被put_queue函数放入read_q队列,之后会调用copy_to_cooked函数如下,在该函数中如果ISIG标志置位了,就会给进程发送相应的信号。可以看见^C发送的是SIGINT信号,^|发送的是SIGQUIT信号,^ Z发送的是SIGTSTP信号。
copy_to_cooked函数片段:
if (L_ISIG(tty)) {
if ((INTR_CHAR(tty) != _POSIX_VDISABLE) &&
(c==INTR_CHAR(tty))) {
kill_pg(tty->pgrp, SIGINT, 1);
continue;
}
if ((QUIT_CHAR(tty) != _POSIX_VDISABLE) &&
(c==QUIT_CHAR(tty))) {
kill_pg(tty->pgrp, SIGQUIT, 1);
continue;
}
if ((SUSPEND_CHAR(tty) != _POSIX_VDISABLE) &&
(c==SUSPEND_CHAR(tty))) {
if (!is_orphaned_pgrp(tty->pgrp))
kill_pg(tty->pgrp, SIGTSTP, 1);
continue;
}
}