嵌入式linux:getchar() 非阻塞

    #由于getchar()函数会一直阻塞,网上搜到下面的函数来实现非阻塞的读取。实际使用的时候只需要调用kbhit()函数即可。其他函数没有看是什么意思
    #include <stdio.h>
    #include <string.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <termios.h>
    #include <unistd.h>

    static struct termios ori_attr, cur_attr;

    static __inline
    int tty_reset(void)
    {
            if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)
                    return -1;

            return 0;
    }


    static __inline
    int tty_set(void)
    {
           
            if ( tcgetattr(STDIN_FILENO, &ori_attr) )
                    return -1;
           
            memcpy(&cur_attr, &ori_attr, sizeof(cur_attr) );
            cur_attr.c_lflag &= ~ICANON;
    //        cur_attr.c_lflag |= ECHO;
            cur_attr.c_lflag &= ~ECHO;
            cur_attr.c_cc[VMIN] = 1;
            cur_attr.c_cc[VTIME] = 0;

            if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)
                    return -1;

            return 0;
    }

    static __inline
    int kbhit(void)
    {
                      
            fd_set rfds;
            struct timeval tv;
            int retval;

            /* Watch stdin (fd 0) to see when it has input. */
            FD_ZERO(&rfds);
            FD_SET(0, &rfds);
            /* Wait up to five seconds. */
            tv.tv_sec  = 0;
            tv.tv_usec = 0;

            retval = select(1, &rfds, NULL, NULL, &tv);
            /* Don't rely on the value of tv now! */

            if (retval == -1) {
                    perror("select()");
                    return 0;
            } else if (retval)
                    return 1;
            /* FD_ISSET(0, &rfds) will be true. */
            else
                    return 0;
            return 0;
    }


    int main()
    {
            int tty_set_flag;
            tty_set_flag = tty_set();
            while(1) {

                    if( kbhit() ) {
                            const int key = getchar();
                            printf("%c pressed\n", key);
                            if(key == 'q')
                                    break;
                    } else {
                            fprintf(stderr, "<no key detected>\n");
                    }
            }

            if(tty_set_flag == 0)
                    tty_reset();
            return 0;
    }


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值