の動作は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");
}