等待 Stdin 时未调用 select 调用之前的 Printf

Printf before the select call isn't invoked while waiting for Stdin

这是我的代码:

int main()
{
    struct timeval tv;
    fd_set fds;
    char cmd[256]={};
    int second = 0, ret;

    printf("Enter Command : ");
    while (1) {
        tv.tv_sec=1;
        tv.tv_usec=0;

        FD_ZERO(&fds);

        FD_SET(STDIN_FILENO, &fds);

        if ((ret = select(STDIN_FILENO+1, &fds, NULL, NULL, &tv)) < 0 ) {
            printf("Select Failed: Exiting\n");
            break;
        }

        if (FD_ISSET(STDIN_FILENO, &fds))
        {
            if (fgets(cmd, 256, stdin) != NULL) {
                printf("Running Command - %s\n", cmd);
                input_invoke_func(cmd);
                printf("Enter Command : ");
            }
        } else {
            second++;
            //print_time(second);
        }
    }
    return 0;
}

我看到 "Enter Command: " 字符串只有在我在 STDIN 中提供任何输入后才会打印出来。请让我知道这种行为的原因!!

谢谢。

输入和输出缓冲在标准库中。这意味着 "printed" 或写入文件的数据不会立即发送到操作系统(因此发送到屏幕或文件)。这样做是因为实际发送数据有一些开销,并且以更大的批次执行此操作更有效。要强制发送数据,可以调用 fflush:

printf("Enter Command : ");
fflush(stdout);

注意:当标准输出连接到终端时,换行符会自动刷新。