select()函数不允许printf()结尾没有“\n”
我在使用select时遇到问题:它在我的程序中表现得很奇怪,我不明白为什么select()函数不允许printf()结尾没有“\n”,c,sockets,select,io,printf,C,Sockets,Select,Io,Printf,我在使用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, &rea
#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: OK
让我们将调用printfInput:中的参数更改为输入:\n。我们将得到的是
Input:
123
OK
因此,select函数将冻结输出,直到下一次printf以\n结尾
如何获得预期的行为?默认情况下,stdout是行缓冲的,这意味着在遇到“\n”之前不会写入输出。因此,需要在printf之后使用fflush强制将缓冲数据写入屏幕
另外,您可以使用常量STDIN\u FILENO(始终为0),而不是执行filenostdin。默认情况下,stdout是行缓冲的,这意味着在遇到“\n”之前不会写入输出。因此,需要在printf之后使用fflush强制将缓冲数据写入屏幕
此外,您可以使用常量STDIN\u FILENO(始终为0),而不是执行filenostdin。fflush将所有缓冲数据刷新到相关流中。它是为了提高系统的性能,因此I/O以批量方式进行。fflush将所有缓冲数据刷新到相关流中。这是为了提高系统的性能,所以I/O是批量进行的。伙计,你太棒了。非常感谢您如此快速和有用的帮助!俄罗斯致以最良好的问候和祝愿!伙计,你太棒了。非常感谢您如此快速和有用的帮助!俄罗斯致以最良好的问候和祝愿!
Input:
123
OK