FD_ISSET如何运作?

时间:2015-03-27 18:07:32

标签: c sockets

手册页说FD_ISSET检查套接字是否在集合中。因此,我认为条件if (FD_ISSET(STDIN, &readfds))应该在stdin设置时立即打印出来,但它实际上等到我按下回车键。我在这里想念什么?当程序调用{​​{1}}时,真正的stdin已经已设置吗?

为什么如果我输入其他字符而不是输入键,控制台会返回未找到的命令?我认为这个角色应该被当作任何其他角色来对待,例如我可以fgets。

FD_SET(STDIN, &readfds)

1 个答案:

答案 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");