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

Vin*_*uda 2 c linux bash signals ctrl

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

ric*_*ici 6

Linux 终端输入处理的描述可以在 中找到man tcsetattr,您可以使用该函数来配置熟输入的映射。(在数组中查找c_cc特殊字符列表。)Linux 终端基于Posix 标准,但它有许多扩展。(特殊字符列表位于 Posix 的 §11.1.9 中,但您还应该阅读前面的部分以完整了解终端编程模型。)

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

  • SIGINTVINTR, 默认Ctrl-C

  • SIGQUITVQUIT, 默认Ctrl-\

  • SIGTSTPVSUSP, 默认Ctrl-Z

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

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

如果您想使用readline,则需要查阅其文档

大多数使用的应用程序ncurses也是通过将终端置于原始模式开始的。


笔记

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

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