Li-Guangda Asked: 2022-02-16 20:54:21 +0800 CST2022-02-16 20:54:21 +0800 CST 2022-02-16 20:54:21 +0800 CST 哪个进程负责将 Ctr+C 映射到 systemd+agetty+login+bash 中的 intr 信号? 772 我正在尝试阅读源代码以了解哪个进程负责这些映射,但我仍然无法弄清楚。谁能给我一个关于哪个代码与它相关的提示? 源代码: agetty+login(util-linux项目), systemd bash systemd 2 个回答 Voted Best Answer user10489 2022-02-16T21:39:20+08:002022-02-16T21:39:20+08:00 没有进程负责此映射。这是一个设备驱动函数,是内核的一部分,ctrl-c默认使用。 ctrl-c由 tty(或 pty)设备映射到SIGINT,并将发送到控制终端的前台进程。 Systemd 将 agetty 连接到 tty 设备并启动它,然后 agetty 初始化 tty 设备(使用 stty 或 tcsetattr 的系统调用版本)并等待输入,最终执行 exec() 登录。 例如,如果使用 tcsetattr,它会将 termios 结构应用于 tty,其中包括c_cc数组,其中包括 tty 映射到动作(包括行编辑和信号和其他东西)的特殊字符,包括VINTR默认为ctrl-c,和还设置允许此类字符由 tty 解释的模式标志。 一段时间后,应用程序(如 bash 或 vim 或 emacs)也将操纵 termios 并更改模式位以可能禁用行编辑字符(然后模拟它们),甚至禁用部分或全部中断字符,以便它们可以逐字阅读并根据应用程序的需要使用。 Li-Guangda 2022-02-19T02:30:15+08:002022-02-19T02:30:15+08:00 我认为默认信号映射由 Linux 内核处理,而不是早期进程(init、agetty、login 或 bash)。 但是,它可以由关联的termios 库设置/获取。 为了验证我的假设,我编写了一个简单的测试程序(test.c)并将其作为内核调用的第一个进程(就像 init 一样)。代码如下: /* test.c */ #include <stdio.h> #include <unistd.h> #include <termios.h> int main(int argc, char **argv) { struct termios ts; tcgetattr(STDIN_FILENO, &ts); printf("INTR: %u\nSUSP: %u\n", ts.c_cc[VINTR], ts.c_cc[VSUSP]); return 0; } 然后将其设置为init并重新启动系统,程序将显示: INTR: 3 SUSP: 26 这两个值分别对应于^C和^Z。这意味着内核默认完成这项工作。
没有进程负责此映射。这是一个设备驱动函数,是内核的一部分,ctrl-c默认使用。
ctrl-c由 tty(或 pty)设备映射到
SIGINT
,并将发送到控制终端的前台进程。Systemd 将 agetty 连接到 tty 设备并启动它,然后 agetty 初始化 tty 设备(使用 stty 或 tcsetattr 的系统调用版本)并等待输入,最终执行 exec() 登录。
例如,如果使用 tcsetattr,它会将 termios 结构应用于 tty,其中包括
c_cc
数组,其中包括 tty 映射到动作(包括行编辑和信号和其他东西)的特殊字符,包括VINTR
默认为ctrl-c,和还设置允许此类字符由 tty 解释的模式标志。一段时间后,应用程序(如 bash 或 vim 或 emacs)也将操纵 termios 并更改模式位以可能禁用行编辑字符(然后模拟它们),甚至禁用部分或全部中断字符,以便它们可以逐字阅读并根据应用程序的需要使用。
我认为默认信号映射由 Linux 内核处理,而不是早期进程(init、agetty、login 或 bash)。
但是,它可以由关联的
termios
库设置/获取。为了验证我的假设,我编写了一个简单的测试程序(test.c)并将其作为内核调用的第一个进程(就像 init 一样)。代码如下:
然后将其设置为
init
并重新启动系统,程序将显示:这两个值分别对应于
^C
和^Z
。这意味着内核默认完成这项工作。