• linux系统kbhit的几种实现


    一,用select

    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/time.h>

    void changemode(int);
    int kbhit(void);
    int main(void)
    {
    int ch;
    changemode(1);
    while ( !kbhit() )
    {
    putchar('.');
    }

    ch = getchar();

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

    changemode(0);
    return 0;
    }

    void changemode(int dir)
    {
    static struct termios oldt, newt;

    if ( dir == 1 )
    {
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);
    }
    else
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    }

    int kbhit (void)
    {
    struct timeval tv;
    fd_set rdfs;

    tv.tv_sec = 0;
    tv.tv_usec = 0;

    FD_ZERO(&rdfs);
    FD_SET (STDIN_FILENO, &rdfs);

    select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
    return FD_ISSET(STDIN_FILENO, &rdfs);

    }

     

    二,用非阻塞io

    #include <stdio.h>

    #include <termios.h>

    #include <unistd.h>

    #include <fcntl.h>

    int kbhit(void)

    {

    struct termios oldt, newt;

    int ch;

    int oldf;

    tcgetattr(STDIN_FILENO, &oldt);

    newt = oldt;

    newt.c_lflag &= ~(ICANON | ECHO);

    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);

    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

    ch = getchar();

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

    fcntl(STDIN_FILENO, F_SETFL, oldf);

    if(ch != EOF)

    {

    ungetc(ch, stdin);

    return 1;

    }

    return 0;

    }

    int main(void)

    {

    while(!kbhit())

    puts("Press a key!");

    printf("You pressed '%c'!/n", getchar());

    return 0;

    }

     

  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3717262.html
Copyright © 2020-2023  润新知