微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

终端在使用 termios 后进入非阻塞模式

如何解决终端在使用 termios 后进入非阻塞模式

我想制作一个类似 ssh 的程序(用于练习),我需要使用 termios 才能立即获取密钥(无需等待用户按 Enter)

以下代码可以成功使输入无阻塞:

int NonBlockingMode() {
    struct termios options;
    if(tcgetattr(0,&options) == -1) {
        return -1;
    }

    options.c_lflag = options.c_lflag |
                                ~ICANON |
                                ~ECHO;
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 1;

    if(tcsetattr(0,TCSANow,&options) == -1) {
        return -1;
    }

    int normal_flags = fcntl(0,F_GETFL,NULL);
    fcntl(0,F_SETFL,normal_flags | O_NONBLOCK);

    return 0;
}

但是我无法让它恢复正常。

我尝试了以下方法

int BlockingMode() {
    struct termios options;
    if(tcgetattr(0,&options) == -1) {
        return -1;
    }
    options.c_lflag = options.c_lflag |
                                ICANON |
                                ECHO;

    if(options.c_cc[VMIN] == 0)
    options.c_cc[VMIN] = 1;

    if(options.c_cc[VTIME] != 0)
    options.c_cc[VTIME] = 0;

    if (tcsetattr(0,normal_flags | ~O_NONBLOCK);

    return 0;
}

使用以下代码应该很容易找到问题:

int main() {
    std::string test;

    std::cin >> test;
    std::cout << std::endl << test << std::endl;
    BlockingMode();
    NonBlockingMode();

    // should be executed but in a non-blocking mode
    // you shouldn't be able to type anything
    test = "";
    std::cin >> test;
    std::cout << std::endl << test << std::endl;
}

执行此代码后,您将无法在终端中使用 CTRL-C

例如。通常在大多数终端中,当您按下 CTRL-C 时,它会显示一个 ^C 字符,您不应该看到这个字符

感谢任何帮助。

注意

当我跑步时有一条消息:readline: warning: turning off output flushing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?