c - select() 函数不允许最后没有 "\n"的 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, &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/

相关文章:

C/XC8 语法 : Can invert and AND operation be used in the same statement?

c - 单步执行直到退出函数 gdb

python-3.x - python 选择器模块是做什么的,它是如何工作的?(python3)

sockets - 如何路由QEMU内部的TCP端口/套接字?

c++ - 了解 POSIX select() 和读写 fd_set

python - 套接字应该是非阻塞的以便在 Python 中使用 select 吗?

c - 使用 C 共享库中声明的结构

java - 套接字编程 java - 套接字连接存活了多长时间?我该如何控制它?

PHP MYSQL Select where 多个变量

c++ - 如何将文本附加到 Windows 中的文件?