2

たとえばputs()、システムコールを呼び出しますwrite()write()それは、呼び出すたびに呼び出すことを意味しますかputs()、それとも、呼び出す前にプットがバッファに蓄積されることを意味しますwrite()か?

4

2 に答える 2

3

stdio関数はバッファリングを利用します。の特定のケースではputs()、常に完全な行をに書き込みます。端末に接続されているstdout場合、stdout通常は行バッファリングされるため、を呼び出すたびputs()に。が呼び出されwrite()ます。

ただし、を使用して(これが他の操作の前に実行される限り)、またはより一般的にはパイプまたはファイルに添付してプログラムを実行することにより、stdout完全にバッファリングすることができます。この場合、への各呼び出しが必ずしもへの呼び出しになるとは限りません。setvbuf()stdoutstdoutputs()write()

于 2013-03-02T04:07:14.293 に答える
2

その通りです。通常、CFILE*ストリームにはデータを格納するバッファがあります。バッファがいっぱいになるか、ストリームが閉じられるか、fflush呼び出された場合にのみ、Unix I/Oシステムコールが実行されます。C標準機能を使用して、ストリームのバッファリングを制御できますsetvbuf

于 2013-03-02T03:54:44.413 に答える