手册页说FD_ISSET检查套接字是否在集合中。因此,我认为条件if (FD_ISSET(STDIN, &readfds))
应该在stdin设置时立即打印出来,但它实际上等到我按下回车键。我在这里想念什么?当程序调用{{1}}时,真正的stdin已经已设置吗?
为什么如果我输入其他字符而不是输入键,控制台会返回未找到的命令?我认为这个角色应该被当作任何其他角色来对待,例如我可以fgets。
FD_SET(STDIN, &readfds)
答案 0 :(得分:2)
选择将等待输入或超时。 你觉得FD_ISSET正在等待进入,因为 选择timedout。
如果你检查retval,你会更好理解
struct timeval tv;
fd_set readfds;
int retval;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
// don't care about writefds and exceptfds:
printf ("before select \n" );
retval = select(STDIN+1, &readfds, NULL, NULL, &tv);
printf ("after select \n" );
if (retval == -1)
perror("select()");
else if (retval > 0)
{
//if (FD_ISSET(STDIN, &readfds));
printf("Data is available now.\n");
}
else
printf("No data . timedout \n");