C select()超时STDIN单个字符(无ENTER)

时间:2011-12-15 04:08:07

标签: c++ c sockets stdin nonblocking

我希望能够使用select()来处理从STDIN输入单个字符(无输入)。

因此,当用户按下一个键时,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键才能完成。我只是想让选择不等待用户按下键并输入。

感谢。

2 个答案:

答案 0 :(得分:3)

我相信,当一个密钥进入终端时,它会被缓冲,直到你按下ENTER,即就程序而言,你没有输入任何东西。您可能需要快速查看this question

答案 1 :(得分:1)

在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来电的错误留给读者练习。