標準IOライブラリのバッファメカニズムによる問題
バッファ機構I/Oと無バッファ機構I/Oの違いを紹介する前に.まず一つの例を見て予熱して、なぜか知っていれば、両者の違いについてはっきりしていることを説明して、結果を見て驚いたら、まだ少しずれていることを説明します.
stdoutがディスプレイの場合、結果は次のとおりです.
[root@localhost]# ./fork
Befor fork.
i=11
i=10 [root@localhost]#
stdoutがファイルの場合、結果を実行します.
[root@localhost]# ./fork > ./temp.txt [root@localhost]# cat ./temp.txt
Befor fork.
i=11
Befor fork.
i=10
違いはここに2つのBefor forkがあることだ.文.サブプロセスは親プロセスのバッファを継承し、fork時に親プロセスのバッファが空になっていないため、最初の出力文はサブプロセスのバッファにコピーされ、次の出力に従ってreturn時にファイルに出力されます.stdoutがディスプレイの場合、標準I/Oライブラリ関数はラインキャッシュをとるため、2本のBefore forkは現れなかった.出力します.
#include <stdio.h>
#include <unistd.h>
int main()
{
int i=10,pid;
printf("nBefor fork.n");
fflush(stdout);
if((pid=fork())<0)
{
printf("nError fork!");
return 1;
}
else if(pid==0)
i++;
else
sleep(2);
printf("ni=%dn",i);
return 0;
}
stdoutがディスプレイの場合、結果は次のとおりです.
[root@localhost]# ./fork
Befor fork.
i=11
i=10 [root@localhost]#
stdoutがファイルの場合、結果を実行します.
[root@localhost]# ./fork > ./temp.txt [root@localhost]# cat ./temp.txt
Befor fork.
i=11
Befor fork.
i=10
違いはここに2つのBefor forkがあることだ.文.サブプロセスは親プロセスのバッファを継承し、fork時に親プロセスのバッファが空になっていないため、最初の出力文はサブプロセスのバッファにコピーされ、次の出力に従ってreturn時にファイルに出力されます.stdoutがディスプレイの場合、標準I/Oライブラリ関数はラインキャッシュをとるため、2本のBefore forkは現れなかった.出力します.