该手册说明FD_ISSET检查套接字是否在集合中。因此,我认为条件
为什么如果我输入的是其他字符而不是enter键,控制台会返回命令未找到?我认为这些字符应该像我使用fgets时输入的任何其他字符一样被处理。
if (FD_ISSET(STDIN, &readfds))
应该立即打印输出,如果stdin在集合中,但实际上它会等待我按enter键。我错了什么?是不是当程序调用FD_SET(STDIN, &readfds)
时,stdin已经被设置好了?为什么如果我输入的是其他字符而不是enter键,控制台会返回命令未找到?我认为这些字符应该像我使用fgets时输入的任何其他字符一样被处理。
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define STDIN 0 // file descriptor for standard input
int main(void)
{
struct timeval tv;
fd_set readfds;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
// don't care about writefds and exceptfds:
select(STDIN+1, &readfds, NULL, NULL, &tv);
if (FD_ISSET(STDIN, &readfds))
printf("A key was pressed!\n");
else
printf("Timed out.\n");
return 0;
}
select
等待什么?请注意,此系统调用会重用输入集作为输出。 - doynaxselect
不是特别等待回车键。相反,它在等待你要求的STDIN
输入,而在 cooked 模式下,控制台会缓冲整行并一次性传递。 - doynaxselect
的输入中,读取集合指定等待的文件描述符集合,而在返回时则返回具有可读输入的子集描述符。如果您等待超时,则标准输入上没有可读内容,因此标志将被清除。 - doynax