我在使用 select() 时遇到问题:它在我的程序中表现得很奇怪,我不明白为什么。
#include <stdio.h>
#include <netdb.h>
int main()
{
char msg[1024];
fd_set readfds;
int stdi=fileno(stdin);
FD_SET(stdi, &readfds);
for (;;) {
printf("Input: ");
select(stdi+1, &readfds, NULL, NULL, NULL);
if (FD_ISSET(stdi, &readfds))
{
scanf("%s",msg);
printf("OK\n");
}
}
}
您期望什么程序行为?大概和我一样(123是我输入的字符串):
Input: 123
OK
但真正的程序行为是这样的:
123
Input: OK
让我们将调用 printf("Input: ") 中的参数更改为 "Input:\n"。我们得到的是
Input:
123
OK
所以 select() 函数卡住输出直到下一个以“\n”结尾的 printf()。
我该怎么做才能获得预期的行为?
最佳答案
默认情况下,stdout
是行缓冲的,这意味着在遇到 '\n'
之前不会写入输出。因此,您需要在 printf
之后使用 fflush
来强制将缓冲数据写入屏幕。
此外,您可以只使用常量 STDIN_FILENO
(始终为 0),而不是执行 fileno(stdin)
。
关于c - select() 函数不允许最后没有 "\n"的 printf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168643/