Поведение 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");
}