0

私はシステムプログラミングを本当に理解しようとしている初心者です。次のプログラムでは、'temp1' というファイル (1 2 3 4 を含む) を読み取り、その内容を stdout に出力しています。ただし、open によって返されるファイル記述子の値も確認したいと考えていました。5 行目の printf 呼び出しに '\n' を含めると、出力は値 filep を最初に出力し、次に file の内容を出力します。しかし、改行を削除すると、ファイルの内容が最初に出力され、次に filep の値が出力されます。なぜこれが起こるのでしょうか?

     int main(){
     char buf[BUFSIZ];
     int n, filep;

     // Open the file
     filep = open("temp1", 'r');
     printf("%d\n", filep); // the newline alters program behaviour

     while((n=read(filep, buf, BUFSIZ)) > 0)
         write(1, buf, n);
     return 0;
    }

gcc 4.6.3 を使用しています。

4

1 に答える 1

3

<stdio.h>のような関数printfバッファリングされます。write(2)出力関数はsyscall をときどきしか呼び出しません。通常、出力関数などは内部バッファprintfにのみ入れられます。FILE

stdout、端末への出力時に行バッファリングされます ( isatty(3)を参照)。したがって、printfフォーマット文字列がで終わる場合\n、書き込みが発生します。

ループの前にfflush(stdout);orfflush(NULL);呼び出しを追加できます。while

fflush(3)およびsetvbuf(3 ) を参照してください。

フラッシュしない場合stdout( \nprintf 形式の文字列を使用するか、明示的に または を介しfflush​​てfclose)、バッファはmain(いくつかの暗黙のatexit(3)を介して...)の最後でのみフラッシュされます。

だからあなたに起こっていることは、(なしで\n)データがstdoutバッファにとどまり、実際にはプログラムの終了時にのみ(write(2)内部stdioライブラリによって)書き込まれるということです。

高度な Linux プログラミングを読んでください。

于 2013-05-11T07:28:53.623 に答える