我在unix非阻塞IO编程方面有一些经验。我把一个select()和getchar()函数放在一个无限循环中,期望如果我输入多个字符到stdin并按输入,所有这些字符将由{{逐个打印出来“ 1}}。但是,它只是我输入的第一个字符被打印,其他字符在我再次输入字符之前没有打印。
这是我的代码:
printf()
结果是:
int main () {
fd_set readFdSet;
struct timeval timeout;
int selectResult;
char c;
while(1) {
FD_ZERO(&readFdSet);
FD_SET(fileno(stdin), &readFdSet);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
selectResult = select(fileno(stdin)+1, &readFdSet,
NULL, NULL, &timeout);
if (FD_ISSET(fileno(stdin), &readFdSet)) {
c = getchar();
printf("getchar: %c\n", c);
}
}
}
答案 0 :(得分:4)
这可能是因为您正在混合使用缓冲和非缓冲的标准输入函数。 Select
应与read
和write
结合使用。在您的情况下,请使用以下内容替换c = getchar();
。
read(fileno(stdin), &c, 1);
另请注意,fileno(stdin)
最好被称为STDIN_FILENO
。