使用Linux OS,我需要透明地将所有击键从远程连接传递到本地硬件连接。除了信号以外,这一切都很简单。我知道我可以为捕获和传递击键的每个信号注册处理程序,但这似乎是一个可能不适用于边缘案例的黑客(如果有人更改中断键组合映射,我会仔细地通过击键,等等。(。
为了提出一个更好的解决方案,我确实需要更多地了解关键连击,即:ctrl-c,成为信号,即:sigint。
- KeyCombo如何成为信号(在内核,客户端应用程序,运行时(?
- 击键仍然通过吗?如果Ctrl-C有一个无效处理程序,STDIN是否仍然获得Ctrl-C?
- 不将任何击键解释为信号组合的最佳方法是什么?这可以在TTY或环境设置中完成吗?
- 钥匙组合被终端的线纪律(TTY子系统中的一层(转化为信号。这是Wikipedia的描述:
例如,标准线纪律会根据类似于Unix的系统的终端的要求,从硬件驱动程序和应用程序写入设备的应用程序中接收到的数据。在输入上,它处理特殊字符,例如中断字符(通常是控制c(以及擦除和杀死字符(通常为backspace或delete和control-u(,并且在输出时,它用一个替换了所有LF字符cr/lf序列。
-
键盘未传递,当信号升高时会被抑制。如果该过程没有Sigint处理程序,则内核将终止它。
-
您显然可以覆盖以下内容:这就是
ssh
之类的工具的工作方式。您可以通过将终端设置为"原始"模式来轻松执行此操作,例如使用Shell命令stty raw
。如果您运行cat -vE
,则可以击中您想要的任何键,并以Caret符号打印它们。确保按照关闭终端的方式进行计划,因为您显然不能再将其ctrl-c/z/d出来了。
KeyCombo如何成为信号(在内核,客户端应用程序,运行时(?
此翻译作为内核TTY线纪律的一部分。还有许多其他翻译作为此过程的一部分执行的,例如文件终止(^d(,停止信号(^z(,字符回声,基本线编辑(backspace,^u等(和del/BS和CR/CRLF翻译。
击键仍然通过吗?如果Ctrl-C有一个无效处理程序,STDIN是否仍然获得Ctrl-C?
否。由线纪律处理的控制字符未传递到前景过程。
不将任何击键解释为信号组合的最佳方法是什么?可以在TTY或环境设置中完成吗?
使用tcgetattr()
和tcsetattr()
更改终端属性。struct termios
的c_cc
元素包含控制字符的设置;您可以通过将它们设置为_POSIX_VDISABLE
来禁用某些或所有元素。
(您也可以使用cfmakeraw()
-在与上面的同一页面上进行记录 - 清除struct termios
的大多数元素,从而为您提供一个"原始"终端。但是,这可能会使您禁用比您预期的终端行为更多。(