setbufは、入出力バッファを設定するのに使う。
Man page of SETBUF
C言語関数辞典 - setbuf
printf、scanf、fprintf、fscanf、などの標準入出力、ファイル入出力関数は、そのまま入出力してるわけではなく、バッファにいったん貯めてから、出力する。
(これをバッファリングという。)
setbufは、指定したストリームで、自ら用意したバッファをバッファリングに使うようにセットする。
また、NULLをセットすることで、バッファリングしないようにもできる。
#include <stdio.h>
#include <unistd.h>
int main(void){
printf("str1");
sleep(5);
printf("str2");
return 0;
}
例えば、このようなプログラムでは、"str1"が出力されてから、5秒経ち、そのあと"str2"が出力されると想像するかもしれない。
しかし、
実際には、"str1"が出力されずにsleepに入ってしまい、
5秒後に"str1"と"str2"が合わせて出力される。
バッファリングされるが出力されないという例。(意外とこれを扱ってる記事あまり無い。)
"str1"を即時出力したい場合は、setbufでstdoutにNULLを指定して、バッファリングしないようにすればいい。
こうすると、
実行直後に"str1"が出力され、
5秒後に"str2"が出力される。
(バッファをセットする例があまり思いつかなかったので、今回はこうしてみた。)
Sample/c/setbuf/setbuf/src/setbuf at master · bg1bgst333/Sample · GitHub