C select() timeout STDIN单字符(无ENTER)

C select() timeout STDIN single char (no ENTER)

本文关键字:字符 ENTER STDIN select timeout 单字符      更新时间:2023-10-16

我希望能够使用select()从STDIN输入单个字符(没有ENTER)。

因此,当用户按下单个键时,select()应该立即返回,而不是等待用户按ENTER。

int main(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 2 seconds. */
    tv.tv_sec = 2;
    tv.tv_usec = 0;
   retval = select(1, &rfds, NULL, NULL, &tv);
   if (retval == -1)
        perror("select()");
    else if (retval)
        printf("Data is available now.n");
    else
        printf("No data within five seconds.n");
   exit(EXIT_SUCCESS);
}

这是可行的,但是你必须按回车键才能完成。我只是想要选择,而不是等待用户按下键和ENTER。

谢谢。

我相信,当一个键被输入到终端时,它被缓冲,直到你按ENTER,也就是说,就程序而言,你没有输入任何东西。你可能想快速看一下这个问题

在unix风格的环境中,这可以通过termios函数来完成。

你需要禁用规范模式,这是一个终端特性,允许在程序看到输入之前进行行编辑。

#include <termios.h>
#include <unistd.h>
int main(int argc, char **argv)
{
    /* Declare the variables you had ... */
    struct termios term;
    tcgetattr(0, &term);
    term.c_iflag &= ~ICANON;
    term.c_cc[VMIN] = 0;
    term.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &term);
    /* Now the rest of your code ... */
}

捕获可能来自tcgetattrtcsetattr调用的错误留给读者作为练习。