zoukankan      html  css  js  c++  java
  • 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;

    }

     

  • 相关阅读:
    jsop
    对象冒充call
    php中的static
    PHP对象在内存堆栈中的分配
    递归
    php简单日历
    php分页类
    请写一个函数,实现以下功能: 字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”
    php 计算两个文件之间的相对路径方法
    php冒泡排序
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3717262.html
Copyright © 2011-2022 走看看