2017-02-04 2 views
3

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

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. 

Он выполняет команду, прежде чем на самом деле говорят, чтобы

Но когда я закончу код прочь с новой строки «\ п», его выход, как и ожидалось:

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

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

ответ

7

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

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

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

printf("Executing command ls\n"); 

stdio 101:

Малые операции чтения/записи в ОС неэффективны, поэтому stdio IO (по умолчанию) связывает каждый дескриптор файла с входным буфером и выходным буфером. stdio выход выдает выходные данные в соответствующие ФАЙЛЫ (в данном случае это выходной буфер (по), и только тогда, когда (большой) буфер заполнен, системный вызов для записи всего буфера будет сборный (проблема решена).

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

Режим буферизации для stdio FILE также может быть явно манипулирован функцией setvbuf(). См. Справочную страницу в ссылке, чтобы узнать, как ее можно использовать.

+1

Ответ, который вы дали, был информативным и воплотил его в код, работавший как шарм! Я надеюсь быть таким же знающим, как и ты один день :) Спасибо! – Bl4ckH4z3

6

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

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

Смежные вопросы