(在Linux中)
我找到的方法都使用signal
。
没有其他方法吗? 我能做些什么让终端把它放入输入缓冲区吗?
cc_c[VINTR]
或清除该手册页面中描述的ISIG
标志。 首先使用tcgetattr
读取当前终端设置并相应地进行调整,然后使用tcsetattr
设置它们。 确保在程序终止时将终端设置重置为其原始默认值,不能认为shell会为您重置它们。不,signal()
不是方法。你需要配置 tty
驱动程序以进行 原始输入(驱动程序中没有输入字符处理),因此它会传递所有未经处理的字符。但这需要将 tty
输入设备视为特殊设备,并编写特殊代码来处理该情况(这需要您发出多个 ioctl
系统调用)。但由于下面所述的原因,这并不推荐。
其次,还有另一种更简单的方法,不需要使用原始模式。您可以通过在 tty
前加上转义字符来转义 Ctrl-C 字符。在 Linux 和 BSD 系统中,这通常与 Ctrl-V 字符绑定,因此按下 Ctrl-V + Ctrl-C 可以输入一个单独的 Ctrl-C 字符。我刚刚使用 hd
命令检查过了:
$ hd
^C
00000000 : 03 0a : ..
00000002
$ _
signal
是正确的方法。为什么你不能使用它呢?它并不难。 - Bibsigaction
和在Linux上实际上是eventfd
- 尽管这些都不像signal
使用简单。无论如何,这三个都可以捕获按下 Ctrl+C 时发送到进程的信号。 - Aconcagua