Linux 终端输入处理的描述可以在 中找到man tcsetattr,您可以使用该函数来配置熟输入的映射。(在数组中查找c_cc特殊字符列表。)Linux 终端基于Posix 标准,但它有许多扩展。(特殊字符列表位于 Posix 的 §11.1.9 中,但您还应该阅读前面的部分以完整了解终端编程模型。)
终端驱动程序将发送三个信号来响应控制字符:
SIGINT(VINTR, 默认Ctrl-C)
SIGQUIT(VQUIT, 默认Ctrl-\)
SIGTSTP(VSUSP, 默认Ctrl-Z)
如果您将终端设置为原始模式(具有相同的功能),那么您将必须自己发出信号(如果您愿意),并且您可以使用您选择的任何机制来决定触发每个信号的内容。
该readline库(许多 shell 使用)在读取时将终端置于原始模式,然后进行自己的字符映射 [注 2]。然而,当bash将终端移交给命令应用程序时,终端将恢复到默认模式[注1],因此映射由终端驱动程序控制,如文档中所述tcsetattr。
如果您想使用readline,则需要查阅其文档。
大多数使用的应用程序ncurses也是通过将终端置于原始模式开始的。
这实际上有点不精确,因为命令可以修改终端模式。(man stty例如,参见 。)如果某个命令更改了控制字符,则该字符将成为模式的一部分,并将传递给下一个命令。
readline不关闭VINTR处理,因此即使正在使用SIGINT也可以发送;readline这将遵循当前的终端设置。但它确实会关闭其他控制字符。