首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C非阻塞键盘输入?

C非阻塞键盘输入?
EN

Stack Overflow用户
提问于 2018-05-03 07:53:45
回答 2查看 0关注 0票数 0

我试图用C编写一个程序(在Linux上),循环直到用户按下一个键,但不需要按键来继续每个循环。

有没有简单的方法来做到这一点?我想我可以做到这一点,select()但似乎很多工作。

或者,有没有办法在程序关闭之前捕获ctrl- c按键来清理而不是非阻塞的io?

EN

回答 2

Stack Overflow用户

发布于 2018-05-03 16:15:16

代码语言:txt
复制
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>

struct termios orig_termios;

void reset_terminal_mode()
{
    tcsetattr(0, TCSANOW, &orig_termios);
}

void set_conio_terminal_mode()
{
    struct termios new_termios;

    /* take two copies - one for now, one for later */
    tcgetattr(0, &orig_termios);
    memcpy(&new_termios, &orig_termios, sizeof(new_termios));

    /* register cleanup handler, and set the new terminal mode */
    atexit(reset_terminal_mode);
    cfmakeraw(&new_termios);
    tcsetattr(0, TCSANOW, &new_termios);
}

int kbhit()
{
    struct timeval tv = { 0L, 0L };
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(0, &fds);
    return select(1, &fds, NULL, NULL, &tv);
}

int getch()
{
    int r;
    unsigned char c;
    if ((r = read(0, &c, sizeof(c))) < 0) {
        return r;
    } else {
        return c;
    }
}

int main(int argc, char *argv[])
{
    set_conio_terminal_mode();

    while (!kbhit()) {
        /* do some work */
    }
    (void)getch(); /* consume the character */
}
票数 0
EN

Stack Overflow用户

发布于 2018-05-03 17:29:22

代码语言:txt
复制
WINDOW *w = initscr();
cbreak();
nodelay(w, TRUE);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档