c - 我应该重置 SIGINT/SIGTERM 上的 termios 设置吗?

标签 c signals termios

我在玩 termios 并且很快发现如果我更改终端设置并退出,我的更改将持续存在并搞砸我的环境。所以我设置我的程序以使用 tcgetattr 保存初始设置并在退出前重置它们。

然而,我预测,如果我在程序运行时按 Ctrl-C 发送 SIGINT,这将导致终端仍然有我修改过的设置,因为我的程序不会执行将它们重置回旧设置的代码。

但这并没有发生。在 Ubuntu 和 macOS Sierra 中,我的终端设置都恢复了,就好像我在程序中重置了它们一样。

所以问题是:这种行为是我一般可以指望的吗?或者注册信号处理程序以捕获 SIGINT/SIGTERM 并在退出前恢复终端设置是否有意义?

代码

回答这个问题可能不需要看代码,但这里是我的例子,以防你好奇:

#include <stdio.h>
#include <string.h>
#include <termios.h>

int main() {
        // put terminal into non-canonical mode
        struct termios old;
        struct termios new;
        tcgetattr(0, &old);
        new = old;
        new.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(0, TCSANOW, &new);

        // loop: get keypress and display (exit via 'x')
        char key;
        printf("Enter a key to see the ASCII value; press x to exit.\n");
        while (1) {
                key = getchar();
                printf("%i\n", (int)key);
                if (key == 'x') { break; }
        }

        // set terminal back to canonical
        tcsetattr(0, TCSANOW, &old);
        return 0;
}

最佳答案

我有点惊讶地发现我的 Arch Linux 终端设置也“被还原”了。但实际上他们保持不变。当我更改您的代码时,我设法跟踪了一些异常情况。

//...
new.c_lflag &= ~(ICANON | ECHO);
new.c_cc[VMIN]  = 0;
new.c_cc[VTIME] = 0;
//...

所以在这里,如果您不按任何按钮,则输出为 -1。如果您按 Ctrl-C,重新编译并启动原始程序(从同一终端),它还会打印 -1,因此没有自动重置。

我不知道为什么 ECHO 是“隐藏的”,我想知道,但我建议您手动恢复所有终端设置。

关于c - 我应该重置 SIGINT/SIGTERM 上的 termios 设置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850223/

相关文章:

c++ - 如何在 QThread 的运行函数中发出信号?

c++ - 如何混合语音音频

linux - 如何使用 termios 将删除键分配给 Linux 中的另一个字符?

c - 如何读取文件并将每个读取的行拆分为变量或数组

c - 如何维护字符串与其在 C 中的索引之间的映射?

在发送 spider_closed 信号之前调用 Python Scrapy 函数?

python - 通过 termios.TIOCSTI 注入(inject) unicode 字符

c - PostgreSQL:如何获取C扩展函数中的参数?

c - 在c中: create a loop to pop linked nodes off the stack

c - 按 C 中的任意键停止控制台程序