c - 标准缓冲区在系统()调用之前没有被清除

标签 c linux gcc stdout

#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$

为什么在 system() 调用后打印“First Statement”

最佳答案

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

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

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

关于c - 标准缓冲区在系统()调用之前没有被清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419508/

相关文章:

使用while循环计算C中不包括空格的字符数

linux - CMake忽略自定义命令中的变量

linux - 交替的 cron 作业问题

linux - 如何解决 Bash : cd : too many arguements error? 的问题

c - 我在 OSX 上的 gcc 中不断得到 "Segmentation fault: 11",但在 Windows 上工作

string - GCC 的 std::string - 为什么实现如此奇怪

c - 如何按 char 字段对结构数组进行排序,以便空字段位于最后位置?

c - 如何检测 Linux 中符号链接(symbolic link)目录中的一个文件是否被修改

c - 为什么我不能在 for 循环的初始语句中声明多个变量?

c++ - 在我的项目中使用预编译头文件(clang/llvm,但也包括 gcc)。如何在 make 中部署 -include 选项?