Странное поведение при перенаправлении stdout в C - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь перенаправить стандартный вывод в файл, а затем восстановить его обратно в исходный в C, но я сталкиваюсь со следующей странной проблемой - следующий фрагмент кода успешно пишетin stdoutin stdoutв стандартный вывод и in file в соответствующем файле, который все в порядке.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    printf("in stdout \n");
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}

Однако удаление первой строки моей основной функции:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}

приводит к in filein stdoutзаписывается на стандартный вывод и ничего не записывается в файл.Интересно, как это случилось?Спасибо за любую помощь.

1 Ответ

4 голосов
/ 08 января 2012

Это проблема буферизации. Буфер, в который вы записываете «в файл», не очищается до переустановки stdout, поэтому вывод идет в stdout, а не в файл. Добавление fflush(stdout); исправлено здесь.

...