Printfのバッファメカニズム

1782 ワード

今日fork()でプログラムを書いたとき、突然自分がPrintfのバッファメカニズムについてまだ少し理解していないことに気づいたので、Printfのバッファメカニズムはいったいどういうことなのか深く解析してみましょう.
       
まずprintfはライブラリ関数であり、C標準ライブラリから提供され、システム呼び出し関数write()のカプセル化であり、カプセル化である以上、必ず改善と性能の向上があり、使いやすい目的を達成し、バッファメカニズムはその改善の一つである.printf関数のバッファメカニズムをより徹底的に理解するために,次の2つの例を見た.
運転環境:gcc(GCC)4.4.7
コード1:
#include
#include
int main()
{
    printf("hehe
"); int ret = fork(); if(ret==0) { //child printf("I am child
"); } else if(ret<0) { printf("Error
"); } else { printf("I am father
"); } return 0; }

実行結果1:
hehe I am father I am child
コード2:
#include
#include
int main()
{
    printf("hehe");
    int ret = fork();
    if(ret==0)
    {
        //child
        printf("I am child
"); } else if(ret<0) { printf("Error
"); } else { printf("I am father
"); } return 0; }

実行結果2:
heheI am father heheI am child
賢いと信じて、この2つのコードブロックの唯一の違いは、2つのコードの先頭にあるprintfと、1つ目のバンド、2つ目のバンドではありませんが、出力結果は確かに大きく異なります.その原因はprintf関数のバッファメカニズムであり、printf関数は実際には標準出力バッファキューに出力されているだけです.実際にスクリーンに印刷されているわけではありません.標準出力は行バッファメカニズムです.つまり、遭遇するとバッファがリフレッシュされ、スクリーンに出力されます.最初のプログラムでforkが出力され、バッファがリフレッシュされます.そのため、サブプロセスは親の進路のこの内容を継承しません.2番目のプログラムでは、改行符が発生しません.したがって、文字列「hehe」はまだバッファにあり、サブプロセスのバッファにもこの文字列があり、2番目のプログラムはすべて複数の「hehe」を印刷します.
拡張:
行バッファ:'リフレッシュバッファ(stdoutなど)が表示されます.
≪フル・バッファ|Full Buffer|emdw≫:fflush()の表示、バッファがいっぱいになるか、終了するまでバッファがリフレッシュされません(出力ファイルなど)