c - 中断组合键(例如 CTRL-C)如何以及何时转换为信号?
问题描述
使用 Linux 操作系统,我需要将所有击键从远程连接透明地传递到本地硬件连接。对于除信号之外的所有内容,这都是相当直接的。我知道我可以为每个捕获并传递击键的信号注册处理程序,但这似乎是一种可能不适用于边缘情况的技巧(如果有人更改了中断键组合映射,我会双重传递击键等吗? )。
为了想出更好的解决方案,我真的需要更多地了解按键组合,IE:CTRL-C,如何变成信号,IE:SIGINT。
- keycombo 如何成为 Signal(在内核、客户端应用程序、运行时)?
- 击键是否仍然通过?如果 CTRL-C 有一个空处理程序,STDIN 是否仍然得到 CTRL-C?
- 不将任何击键解释为信号组合的最佳方法是什么?这可以在 TTY 或环境设置中完成吗?
解决方案
- 按键组合由终端的线路规程(TTY 子系统中的一层)转换为信号。这是来自维基百科的描述:
例如,标准行规程根据类 Unix 系统上终端的要求处理它从硬件驱动程序和写入设备的应用程序接收的数据。在输入时,它处理特殊字符,例如中断字符(通常是 Control-C)和擦除和终止字符(通常分别是退格或删除和 Control-U),在输出时,它将所有 LF 字符替换为CR/LF 序列。
按键没有通过,当信号发出时它被抑制。如果进程没有 SIGINT 处理程序,内核将终止它。
您显然可以覆盖这一点:这就是工具之类的
ssh
工作方式。您可以通过将终端设置为“原始”模式轻松做到这一点,例如使用 shell 命令stty raw
。如果你然后运行cat -vE
,你可以点击任何你想要的键并看到它们以插入符号表示。确保计划关闭终端的方法,因为您显然不能再使用 Ctrl-C/Z/D 退出它。
推荐阅读
- docker - 使用 Openstack appcontainer 访问主机上的 USB 设备
- java - 即使条件语句检查它的类型是否正确,Kotlin 中的 ClassCastException
- amazon-web-services - 我需要在具有以下触发规则的 AWS Lambda 处理请求方法中放入哪些参数?
- python - 我如何使用复杂网络理论在 SVM 中进行参数优化
- android - Jacoco java.lang.instrument.IllegalClassFormatException:检测类时出错
- java - 在没有实体的文件中休眠本机查询
- php - 如何使用 pdo 和 Ajax 更新 PHOTO
- c# - 如何检查用户输入的字符串是否代表浮点值?
- flutter - 颤振警报不出现
- css - 未在 Rails 应用程序中应用 CSS 更改