[英]C select() timeout STDIN single char (no ENTER)
我希望能夠使用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鍵才能完成。 我只想讓select不等待用戶按下鍵並按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 ... */
}
捕獲可能來自tcgetattr
和tcsetattr
調用的錯誤留給讀者練習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.