【发布时间】:2015-12-03 13:56:21
【问题描述】:
select 函数会阻塞调用进程,直到任何指定的文件描述符集有活动[...] 如果读取调用不会阻塞,则认为文件描述符已准备好读取。 (见:https://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html)
所以我预计,如果您在第一次迭代中输入 > 4 个字符的字符串,则以下程序中的 select 将在第二次迭代中立即返回 ...然而事实并非如此。在第一次输出后按下任何其他键后,它会继续处理所有剩余的输入。为什么?
示例输出:
./selectTest
12345678900
Keyboard input received: 1234
A
Keyboard input received: 5678
Keyboard input received: 900
Keyboard input received: A
代码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(void)
{
fd_set rfds;
char buf[100];
while(1)
{
FD_ZERO(&rfds);
FD_SET(fileno(stdin), &rfds);
if(-1 == select(FD_SETSIZE, &rfds, NULL, NULL, NULL))
{
perror("select() failed\n");
}
if(FD_ISSET(fileno(stdin), &rfds))
{
printf("Keyboard input received: ");
fgets(buf, 5, stdin);
printf("%s\n", buf);
}
}
return 0;
}
(我知道,我不应该再使用 select(),但我正在为考试而学习,我们必须...)
【问题讨论】:
-
你有什么问题?