我希望能够使用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键才能完成。我只是想让选择不等待用户按下键并输入。
感谢。
答案 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 ... */
}
抓住可能来自tcgetattr
和tcsetattr
来电的错误留给读者练习。