2017-02-04 16 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. 

実際

に語った。しかし、私は新しい行「\ n」を持つオフコードを完了すると、期待どおり、その出力がされる前に、それは、コマンドを実行します。

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

なぜそれがあります文字列に改行を追加すると、コードは実行前に何をしているのかを表示しますが、実行せずに実行すると、それが実行されます。

答えて

7

これはバッファリングの問題です。あなたの出力はラインバッファ型の端末であり、あなたが明示的にfflush(stdout)コールの代わりに行を追加することで OKなら

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

か、を:あなたがする必要がある

printf("Executing command ls\n"); 

stdio 101:

OSの読み込み/書き込みが非効率であるため、stdio IO(デフォルト)は、各ファイルハンドル/ディスクリプタを入力バッファと出力バッファに関連付けます。 stdio出力コールは、適切なFILE(この場合はstdout)出力バッファ(memcpyストリング)に出力され、大きな(大)バッファがいっぱいになった場合にのみ、バッファ全体を書き込むためのシステムコール作られた(問題解決された)。

fflush()関数で出力バッファを明示的にフラッシュすることができます。さらに、stdioが出力を検出した場合、FILEは端末であり、出力で改行が発生するたびにfflush()を呼び出すことを意味する行バッファリングを使用します。

stdio FILEのバッファリングモードは、setvbuf()機能で明示的に操作することもできます。どのように使用できるかを知るにはリンクのマンページを参照してください。

+1

答えは有益で、これをコードに実装すると魅力的でした! いつかあなたと同じくらい知りたいと思っています:) ありがとう! – Bl4ckH4z3

6

printfによる標準出力はバッファされます。つまり、printfを呼び出した直後に出力先に​​フラッシュされません。 printfを呼び出さずに別のプロセスを実行してsystemを使用すると、printfが印刷される前に新しいプロセスの出力が印刷されることがあります。

新しい行が追加されるのは、新しい行がすぐにバッファをフラッシュするためです。改行の代わりにfflushも使用できました。

関連する問題