使用Linux操作系统,我需要将所有击键从远程连接透明地传递到本地硬件连接。除了信号以外,这对于所有其他事情都是相当简单的。我知道我可以为捕获并传递按键的每个信号注册处理程序,但这似乎是一种hack,对于某些极端情况可能不起作用(如果有人更改了中断键组合映射,我会两次传递按键等吗? )。
为了提出更好的解决方案,我真的需要更多地了解按键组合IE:CTRL-C如何成为信号IE:SIGINT。
答案 0 :(得分:3)
例如,标准线路规程会根据类Unix系统上终端的要求,处理从硬件驱动程序和写入设备的应用程序接收到的数据。在输入时,它处理特殊字符,例如中断字符(通常为Control-C)以及擦除和终止字符(通常分别为Backspace或Delete和Control-U),并且在输出时,它将所有LF字符替换为CR / LF序列。
未通过按键,在发出信号时将其抑制。如果该进程没有SIGINT处理程序,则内核将终止它。
您显然可以覆盖它:这就是ssh
之类的工具的工作方式。您可以通过将终端设置为“原始”模式来轻松完成此操作,例如使用shell命令stty raw
。如果然后运行cat -vE
,则可以按任意键,并看到它们以脱字符号打印。确保计划好关闭终端的方法,因为显然您不能再从Ctrl-C / Z / D退出终端了。
答案 1 :(得分:1)
按键组合如何变成信号(在内核,客户端应用程序,运行时中)?
此翻译是the kernel's TTY line discipline的一部分。在此过程中还执行了许多其他转换,例如文件结尾(^ D),停止信号发送(^ Z),字符回显,基本行编辑(退格,^ U等)和DEL / BS和CR / CRLF翻译。
按键是否仍然通过?如果CTRL-C具有空处理程序,STDIN是否仍会获得CTRL-C?
不。由行规则处理的控制字符不会传递到前台进程。
不将任何击键解释为信号组合的最佳方法是什么?可以在TTY或环境设置中完成此操作吗?
使用tcgetattr()
and tcsetattr()
更改终端属性。 c_cc
的{{1}}元素包含控制字符的设置;您可以通过将某些或所有元素设置为struct termios
来禁用它们。
(您也可以使用_POSIX_VDISABLE
(在与上一页相同的文档中进行记录)清除cfmakeraw()
的大部分元素,从而使您使用的大多数是“原始”终端。但是,这可能会禁用终端行为超出您的预期。)