の動作はprintf()
の場所に依存するようですstdout
。
- が
stdout
コンソールに送信されると、printf()
行バッファリングされ、改行が出力された後にフラッシュされます。 - がファイル
stdout
にリダイレクトされた場合、fflush()
が呼び出されない限り、バッファはフラッシュされません。 - さらに、がファイルにリダイレクト
printf()
される前に使用された場合stdout
、(ファイルへの) 以降の書き込みは行バッファリングされ、改行の後にフラッシュされます。
いつstdout
行バッファリングされ、いつfflush()
呼び出される必要がありますか?
それぞれの最小限の例:
void RedirectStdout2File(const char* log_path) {
int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
dup2(fd,STDOUT_FILENO);
if (fd != STDOUT_FILENO) close(fd);
}
int main_1(int argc, char* argv[]) {
/* Case 1: stdout is line-buffered when run from console */
printf("No redirect; printed immediately\n");
sleep(10);
}
int main_2a(int argc, char* argv[]) {
/* Case 2a: stdout is not line-buffered when redirected to file */
RedirectStdout2File(argv[0]);
printf("Will not go to file!\n");
RedirectStdout2File("/dev/null");
}
int main_2b(int argc, char* argv[]) {
/* Case 2b: flushing stdout does send output to file */
RedirectStdout2File(argv[0]);
printf("Will go to file if flushed\n");
fflush(stdout);
RedirectStdout2File("/dev/null");
}
int main_3(int argc, char* argv[]) {
/* Case 3: printf before redirect; printf is line-buffered after */
printf("Before redirect\n");
RedirectStdout2File(argv[0]);
printf("Does go to file!\n");
RedirectStdout2File("/dev/null");
}