我应该在SIGINT / SIGTERM上重置termios设置吗?

问题描述 投票:1回答:1

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

但是,我预测,如果我在程序运行时点击Ctrl-C发送SIGINT,那么它会导致终端仍然有我的修改设置,因为我的程序没有执行代码将它们重置回旧设置。

但那并没有发生。在Ubuntu和macOS Sierra中,我的终端设置被还原,就好像我已经在程序中重置它们一样。

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

Code

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

#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;
}
c signals termios
1个回答
1
投票

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

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

所以这里如果你不按任何按钮,输出就是-1。如果你点击Ctrl-C,重新编译并启动原始程序(从同一个终端),它也会打印-1,所以没有自动重置。

我不知道为什么ECHO是“隐藏的”而且我想知道,但我建议你手动还原所有的终端设置。

© www.soinside.com 2019 - 2024. All rights reserved.