【问题标题】:How and when are interrupt key combination,such as CTRL-C, translated to signals?中断组合键(例如 CTRL-C)如何以及何时转换为信号?
【发布时间】:2019-05-07 22:49:38
【问题描述】:

使用 Linux 操作系统,我需要将所有击键从远程连接透明地传递到本地硬件连接。对于除信号之外的所有内容,这都是相当直接的。我知道我可以为每个捕获并传递击键的信号注册处理程序,但这似乎是一种可能不适用于边缘情况的技巧(如果有人更改了中断键组合映射,我会双重传递击键等吗? )。

为了想出更好的解决方案,我真的需要更多地了解按键组合,IE:CTRL-C,如何变成信号,IE:SIGINT。

  1. keycombo 如何成为 Signal(在内核、客户端应用程序、运行时)?
  2. 击键是否仍然通过?如果 CTRL-C 有一个 null 处理程序,STDIN 是否仍然得到 CTRL-C?
  3. 不将任何击键解释为信号组合的最佳方法是什么?这可以在 TTY 或环境设置中完成吗?

【问题讨论】:

  • 简而言之:信号不是击键。它们是无关的。
  • 您希望 tcsetattr (man 3 termios) 将终端设置为原始模式。

标签: c linux ipc embedded-linux tty


【解决方案1】:
  1. 终端的线路规则(TTY 子系统中的一个层)将组合键转换为信号。这是from Wikipedia的描述:

例如,标准行规程根据类 Unix 系统上终端的要求处理它从硬件驱动程序和写入设备的应用程序接收的数据。在输入时,它处理特殊字符,例如中断字符(通常是 Control-C)和擦除和终止字符(通常分别是退格或删除和 Control-U),在输出时,它将所有 LF 字符替换为CR/LF 序列。

  1. 按键没有通过,当信号发出时它被抑制。如果进程没有 SIGINT 处理程序,内核将终止它。

  2. 您显然可以覆盖它:这就是像 ssh 这样的工具的工作方式。您可以通过将终端设置为“原始”模式轻松做到这一点,例如使用 shell 命令stty raw。如果你然后运行cat -vE,你可以点击任何你想要的键并看到它们以插入符号表示。确保计划关闭终端的方法,因为您显然不能再使用 Ctrl-C/Z/D 退出它了。

【讨论】:

    【解决方案2】:

    keycombo 如何成为 Signal(在内核、客户端应用程序、运行时)?

    此翻译作为the kernel's TTY line discipline 的一部分执行。作为此过程的一部分,还执行了许多其他翻译,例如文件结尾 (^D)、停止信号 (^Z)、字符回显、基本行编辑(退格、^U 等)和 DEL/ BS 和 CR/CRLF 翻译。

    击键是否仍然通过?如果 CTRL-C 有一个 null 处理程序,STDIN 是否仍然得到 CTRL-C?

    没有。由行规程处理的控制字符不会传递给前台进程。

    不将任何击键解释为信号组合的最佳方法是什么?这可以在 TTY 或环境设置中完成吗?

    使用tcgetattr() and tcsetattr() 更改终端属性。 struct termiosc_cc 元素包含控制字符的设置;您可以通过将它们设置为 _POSIX_VDISABLE 来禁用部分或全部元素。

    (您也可以使用cfmakeraw()——记录在与上面相同的页面中——清除struct termios 的大部分元素,为您提供一个主要是“原始”终端。但是,这可能会禁用更多终端行为而不是你期待。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2023-04-07
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2012-04-12
      • 2019-10-29
      相关资源
      最近更新 更多