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