2016-01-08 3 views
0

Я пытаюсь с помощью dup2 перенаправить стандартный вывод в другой файл:линукс dup2 и Printf

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main(void) 
{ 
    int newfd; 
    if ((newfd = open("output_file.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644)) < 0) { 
    exit(1); 
    } 
    printf("Luke, I am your...\n"); 
    dup2(newfd, 1); 
    printf("Foobar.\n"); 
    return 0; 
} 

Когда первый printf печатает новая строка \n, Luke, I am your... будет выведена на экран и Foobar будет записан в output_file. txt, если первый printf не печатает новую строку printf("Luke, I am your...");, обе строки будут записаны в output_file.txt. Таким образом, printf будет писать первую строку в буфер, если нет новой строки (\n).

Что на самом деле происходит из-за этого?

+0

http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin – rootkea

ответ

4

Причина в том, что когда у вас нет новой строки \n, строка, напечатанная printf(), буферизуется. Таким образом, весь контент буфера печатается в файле. Это не имеет никакого отношения ко второму звонку printf().

Если вы fflush(stdout); после первого printf(), вы не будете видеть это поведение независимо от того, есть ли у вас новая строка '\n в первом printf() или нет. Потому что fflush() очистит (сброс) весь выходной буфер до этой точки.

Причина в том, что \n в printf(), по-видимому, работает, потому что printf() является линейно-буферизованным при подключении к терминальному устройству. Таким образом, \n запускает промывку.

2

Первая строка по-прежнему буферизуется в FD, когда FD выключается под ним. Если вам необходимо убедиться в том, что FD будет чистым перед переключением, сначала вызовите fflush(stdout).