Стандартный буфер не очищается перед вызовом system () - PullRequest
2 голосов
/ 10 марта 2010
#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 () ??

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Стандартные потоки ввода, вывода и ошибок создаются при запуске вашего процесса, который в данном случае является вашей C-программой. Когда вы делаете системный вызов, создается другой процесс для выполнения команды date, и он получает свой собственный набор потоков.

В вашей программе вывод printf буферизуется в стандартный поток вывода вашей C-программы. Затем вывод даты буферизируется в свой собственный стандартный поток вывода. Когда системный вызов завершается, стандартный поток вывода даты сбрасывается, поэтому вы видите результат. Затем, когда ваша программа на C заканчивается, ее стандартный поток вывода сбрасывается, и вы видите вывод printf.

Вам может пригодиться сообщение этого сотрудника: http://www.pixelbeat.org/programming/stdio_buffering/

2 голосов
/ 10 марта 2010

Вы пытались очистить буфер перед вызовом системы ("дата")?

Я только что добавил fflush(NULL); перед system, и результат получился, как и ожидалось.

1 голос
/ 10 марта 2010

C IO API буферизирует вещи для более эффективной печати. Обычно буфер сбрасывается всякий раз, когда вы пишете новую строку или вручную очищаете ее.

Таким образом, вы можете использовать новую строку для очистки буфера:

printf("First statement\n");

Или используйте функцию fflush:

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