四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1744|回复: 0
打印 上一主题 下一主题

linux系统kbhit的几种实现

[复制链接]
  • TA的每日心情
    开心
    2018-11-9 08:52
  • 241

    主题

    691

    帖子

    7652

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7652
    跳转到指定楼层
    楼主
    发表于 2016-11-21 13:57:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


    一,用select
    1. #include <stdio.h>
    2. #include <termios.h>
    3. #include <unistd.h>
    4. #include <sys/types.h>
    5. #include <sys/time.h>

    6. void changemode(int);
    7. int kbhit(void);
    8. int main(void)
    9. {
    10. int ch;
    11. changemode(1);
    12. while ( !kbhit() )
    13. {
    14. putchar('.');
    15. }

    16. ch = getchar();

    17. printf("\nGot %c\n", ch);

    18. changemode(0);
    19. return 0;
    20. }

    21. void changemode(int dir)
    22. {
    23. static struct termios oldt, newt;

    24. if ( dir == 1 )
    25. {
    26. tcgetattr( STDIN_FILENO, &oldt);
    27. newt = oldt;
    28. newt.c_lflag &= ~( ICANON | ECHO );
    29. tcsetattr( STDIN_FILENO, TCSANOW, &newt);
    30. }
    31. else
    32. tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    33. }

    34. int kbhit (void)
    35. {
    36. struct timeval tv;
    37. fd_set rdfs;

    38. tv.tv_sec = 0;
    39. tv.tv_usec = 0;

    40. FD_ZERO(&rdfs);
    41. FD_SET (STDIN_FILENO, &rdfs);

    42. select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
    43. return FD_ISSET(STDIN_FILENO, &rdfs);
    44. }
    复制代码


    二,用非阻塞io
    1. #include <stdio.h>
    2. #include <termios.h>
    3. #include <unistd.h>
    4. #include <fcntl.h>
    5. int kbhit(void)
    6. {
    7. struct termios oldt, newt;
    8. int ch;
    9. int oldf;
    10. tcgetattr(STDIN_FILENO, &oldt);
    11. newt = oldt;
    12. newt.c_lflag &= ~(ICANON | ECHO);
    13. tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    14. oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    15. fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
    16. ch = getchar();
    17. tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    18. fcntl(STDIN_FILENO, F_SETFL, oldf);
    19. if(ch != EOF)
    20. {
    21. ungetc(ch, stdin);
    22. return 1;
    23. }
    24. return 0;
    25. }
    26. int main(void)
    27. {
    28. while(!kbhit())
    29. puts("Press a key!");
    30. printf("You pressed '%c'!/n", getchar());
    31. return 0;
    32. }
    复制代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-16 07:58 , Processed in 1.046875 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表