每个 ctrl + 键及其信号的行为是什么?

What is the behavior of each ctrl + key and its signals?

给定一个信号列表(kill -l 可以给你),我想知道所有可以引发其中一个信号的 ctrl + 键。例如,当 运行 终端上的前台进程时,ctrl+c 会引发 SIGINT。可能吗 ? ctrl+键映射到系统的哪里?如果有一个 C 功能可以告诉我更好。

大多数 Unix shells 中的 Ctrl-Z 将暂停进程 (SIGTSTP),并且此类暂停的进程可以 运行 在后台 bg 或带回前台fg。进程无法避免挂起信号,除非它们在原始模式下捕获 Ctrl-Z。

Ctrl-S 停止终端输出,而 Ctrl-Q 重新启​​动它。

其余部分取决于您的 shell 或 readline 配置,我建议您阅读 shell 的文档以获取更多信息。

Linux 终端输入处理的描述可在 man tcsetattr, which is the function you would use to configure the mapping for cooked input. (Look for the c_cc array for the list of special characters.) The Linux terminal is based on the Posix standard 中找到,但它有许多扩展。 (特殊字符列表在 Posix 的 §11.1.9 中,但您还应该阅读前面的部分以全面了解终端编程模型。)

终端驱动程序将发送三个信号来响应控制字符:

  • SIGINTVINTR,默认Ctrl-C

  • SIGQUITVQUIT,默认Ctrl-\

  • SIGTSTPVSUSP,默认Ctrl-Z

如果您将终端设置为原始模式(具有相同的功能),那么您将不得不自己发出信号(如果您愿意的话)并且您可以使用您选择的任何机制来决定是什么触发每个信号。

readline 库(被许多 shell 使用)在读取时将终端置于原始模式,然后进行自己的字符映射 [注 2]。但是,当 bash 将终端移交给命令应用程序时,终端将恢复为默认模式 [注 1],因此映射由终端驱动程序控制,如 tcsetattr 文档中所述。

如果您想使用 readline,您将需要 consult its documentation

大多数使用 ncurses 的应用程序也首先将终端置于原始模式。


备注

  1. 这实际上有点不精确,因为命令可以修改终端模式。 (例如,参见 man stty。)如果某个命令更改了控制字符,则该字符将成为将传递给下一个命令的模式的一部分。

  2. readline 不会关闭 VINTR 处理,因此即使正在使用 readline 也可以发送 SIGINT;这将服从当前的终端设置。但它确实关闭了其他控制字符。