怎么在重定向标准输入后无阻塞的获取终端按键(在linux下用c语言实现)?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

怎么在重定向标准输入后无阻塞的获取终端按键(在linux下用c语言实现)?

在实现more命令时所遇到的问题

未考虑重定向前,无阻塞的获取终端按键是如下代码所示实现的

fp_tty = fopen("/dev/tty", "rw");
//更改终端属性,使字符立即输入且不显示
tcgetattr(0, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr(0, TCSANOW, &newt);
int ch = fgetc(fp_tty);

重定向后发现fp_tty始终为NULL

展开
收起
a123456678 2016-06-03 19:04:46 1751 0
1 条回答
写回答
取消 提交回答
  • 代码如下:

    #include <stdio.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <unistd.h>
    
    int main()
    {
        char ch;
        //打开控制终端
        int tty = open("/dev/tty", O_RDONLY);
        struct termios newt, oldt;
        //获取终端属性
        tcgetattr(tty, &oldt);
        newt = oldt;
        //设置字符不缓冲且不回显
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr(tty, TCSANOW, &newt);
        while (1) {
            read(tty, &ch, 1);
            if (ch == 'q') {
                //还原终端属性
                tcsetattr(tty, TCSANOW, &oldt);
                fprintf(stderr, "Quit\n", ch);
                break;
            } else {
                fprintf(stderr, "[%c]\n", ch);
            }
        }
        return 0;
    }
    2019-07-17 19:27:07
    赞同 展开评论 打赏
问答排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载