【问题标题】:Standard Buffer not getting cleared before system() call在 system() 调用之前没有清除标准缓冲区
【发布时间】:2010-03-10 18:29:54
【问题描述】:
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
void handler(int signo)
{
    printf("First statement");
    system("date");
    exit(EXIT_SUCCESS);
}

int main()
{
    signal(SIGINT,handler);
    printf("Waiting for KeyboardInterrupt\n");
    for(;;);
    return 0;
}

试运行:-

shadyabhi@shadyabhi-desktop:~/c$ gcc main.c
shadyabhi@shadyabhi-desktop:~/c$ ./a.out
Waiting for KeyboardInterrupt
^CWed Mar 10 23:55:47 IST 2010
First statementshadyabhi@shadyabhi-desktop:~/c$

为什么 "First Statement" 在 system() 调用之后被打印出来??

【问题讨论】:

    标签: c linux gcc stdout


    【解决方案1】:

    标准输入、输出和错误流是在您的进程启动时创建的,在本例中是您的 C 程序。当您进行系统调用时,会创建另一个进程来执行 date 命令,并获得自己的一组流。

    在您的程序中,printf 输出被缓冲到您的 C 程序的标准输出流中。然后 date 的输出被缓冲到它自己的标准输出流中。当系统调用结束时,日期标准输出流被刷新,因此您可以看到输出。然后,当你的 C 程序结束时,它的标准输出流被刷新,你会看到 printf 输出。

    您可能会发现此人的帖子很有帮助:http://www.pixelbeat.org/programming/stdio_buffering/

    【讨论】:

      【解决方案2】:

      您是否在调用 system("date") 之前尝试刷新缓冲区?

      我刚刚在system前加了fflush(NULL);,输出如预期。

      【讨论】:

      • fflush(NULL) 刷新 ALL 缓冲区,因此谁拥有哪个缓冲区并不重要。带有特定参数的 fflush 仅刷新该缓冲区。
      【解决方案3】:

      C IO API 会缓冲内容以便更有效地打印。通常,每当您写出换行符或手动刷新它时,都会刷新缓冲区。

      所以你可以使用换行符来刷新缓冲区:

      printf("First statement\n");
      

      或者使用 fflush 函数:

      printf("First statement");
      fflush (stdout);
      

      【讨论】:

      • 并不总是添加“\n”(例如,如果标准输出被重定向到文件)。 fflush 将。
      • 实际上,我知道这种情况发生了。但是,正如我的@Mike 所说,我知道 STDOUT 没有被刷新 bcos "date" 命令有另一个 STDOUT 流..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多