端末出力機能をユニットテストしようとしています。この関数はstdoutにデータを流すので、私の考えはstdoutバッファの制御を取得し、関数が正しいデータをバッファに正しく書き込むかどうかをチェックすることでした。標準出力のバッファ処理
setvbufはこれを達成するのに理想的なようでした。
setvbufを使用してstdoutをリダイレクトして、自分で指定したバッファを使用しました。
ストリーミングモード_IOFBFを使用しました。理論的には、バッファがいっぱいになった場合に内部フラッシュが行われるだけです。私のシステム上のBUFSIZは、8192バイトのサイズを持っています...呼び出し中に内部フラッシュなしで、テスト中の関数の出力に十分な大きさ以上です。
マイソースが現在のように見える:このコードをデバッグ
char buffer [BUFSIZ] = {0};
/* any outputs before redirecting */
printf("0\n");
/* output any remaining data */
fflush(stdout);
/* redirect to my buffer with full buffering */
setvbuf(stdout,buffer,_IOFBF,BUFSIZ);
/* testcode ... output of the function under test */
printf("1\n");
printf("2\n");
/* output any remaining data */
fflush(stdout);
/* restore internal buffering with line buffering */
setvbuf(stdout,NULL,_IOLBF,BUFSIZ);
/* let us see what is in our buffer */
printf("%s",buffer);
"は2 \ n" はtestcode部(GCC 5.4.0 x64のGNU libcのバージョンの間の "1 \ n" バッファ内を上書きすることを示します2.23)
出力は次のとおりです。
0
1
2
2
しかし、私は予想:
0
1
2
1
2
私はどんなヒントでも喜ばれます。
私は目を再現することはできませんeエラー。私は期待される出力を得る。 – Beta
確認していただきありがとうございます。これが私のシステムでのclibバッファ処理のバグであるかどうかは不明です。確認するためにどのコンパイラ+バージョンを使用しましたか? – marcas756
おそらく 'setvbuf()'を使っているのでしょうか? C11dr 7.21.5.6 2 "setvbuf関数は、ストリームが指すストリームがオープンファイル**に関連付けられた後で、他の操作**(setvbufへの不成功呼び出しを除く)がストリームに対して実行される前にのみ使用できます" – chux