在调用system()之前,标准缓冲区未被清除

时间:2010-03-10 18:29:55

标签: 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$

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

3 个答案:

答案 0 :(得分:2)

您是否在调用系统(“日期”)之前尝试刷新缓冲区?

我刚刚在fflush(NULL);之前添加了system,输出符合预期。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

C IO API缓解了一些问题,以便更有效地进行打印。通常,只要您写出换行符或手动刷新缓冲区,就会刷新缓冲区。

因此您可以使用换行符来刷新缓冲区:

printf("First statement\n");

或使用fflush功能:

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