Программа C выполняет команду перед тем, как

Я начал изучать обработку команд с C, но столкнулся с проблемой этой программы на C. Выполняет ls Команда, прежде чем она предназначена.

Gcc информация:

gcc version 6.2.1 20161124 (Debian 6.2.1-5)

Это код:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;

    printf("Is command processor available?\n");
    if (system(NULL))
    {
        printf("Command processor available!\n");
    }
    else
    {
        printf("Command processor not available!\n");
        exit(1);
    }

    printf("Executing command ls");
    i=system("ls");

    printf("Returned value is: %d.\n",i);
    return 0;
}

Кусок кода, о котором я говорю, - это конкретная строка:

    printf("Executing command: ls");

Если программа запускается с этим фрагментом кода, вывод:

Is command processor available?
Command processor is available
systemProcessing  systemProcessing.c
Executing command: lsReturned value is: 0.

Он выполняет команду до того, как ему

Но когда я заканчиваю код новой строкой '\n', его вывод будет таким, как ожидалось:

Is command processor available?
Command processor is available
Executing command: ls
systemProcessing  systemProcessing.c
Returned value is: 0.

Почему с новой строкой, добавленной в строку, код печатает то, что он собирается сделать перед выполнением, но без него он выполняет, а затем печатает то, что собирается выполнить?

2 ответа

Решение

Это проблема буферизации. Вам нужно сделать:

printf("Executing command ls");
fflush(stdout); //<<
i=system("ls");

или, если ваш вывод является терминалом с линейной буферизацией, и вы в порядке с добавлением строки вместо явного fflush(stdout) вызов:

printf("Executing command ls\n"); 

stdio 101:

Небольшие операции чтения / записи в ОС неэффективны, поэтому ввод-вывод stdio (по умолчанию) связывает каждый дескриптор / дескриптор файла с входным буфером и выходным буфером. вывод stdio вызывает вывод в соответствующий выходной буфер FILE (в данном случае это stdout) (memcpy(строка)), и только когда (большой) буфер заполнен, будет выполнен системный вызов для записи всего буфера (проблема решена).

Явная очистка выходного буфера может быть вызвана с помощью fflush() функция. Кроме того, если stdio обнаружит, что выходной FILE является терминалом, он будет использовать буферизацию строки, что означает, что он вызовет fflush() всякий раз, когда он встречает новую строку в выводе.

Режим буферизации ФАЙЛА stdio также можно явно манипулировать с помощью функции setvbuf(). Смотрите man-страницу в ссылке, чтобы узнать, как ее можно использовать.

Стандартный вывод через printf буферизируется, что означает, что он не сбрасывается в пункт назначения сразу после вызова printf, Когда вы используете system запустить отдельный процесс после вызова printf без этого сбрасывается, что вывод нового процесса может напечатать до вашего printf печатается.

Добавление новой строки имеет значение, поскольку новая строка немедленно очищает буфер. Вы могли бы использовать fflush тоже вместо новой строки.

Другие вопросы по тегам