перенаправить стандартный вывод в c, а затем сбросить стандартный вывод - PullRequest
6 голосов
/ 24 июля 2011

Я пытаюсь использовать перенаправления в C для перенаправления ввода в один файл и затем вернуть стандартный вывод обратно для печати на экран. Может кто-нибудь сказать мне, что не так с этим кодом?

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

int main(int argc, char** argv) {
    //create file "test" if it doesn't exist and open for writing setting permissions to 777
    int file = open("test", O_CREAT | O_WRONLY, 0777);
    //create another file handle for output
    int current_out = dup(1);

    printf("this will be printed to the screen\n");

    if(dup2(file, 1) < 0) {
        fprintf(stderr, "couldn't redirect output\n");
        return 1;
    }

    printf("this will be printed to the file\n");

    if(dup2(current_out, file) < 0) {
        fprintf(stderr, "couldn't reset output\n");
        return 1;
    }

    printf("and this will be printed to the screen again\n");

    return 0;
}

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Одна вещь, которую вы должны сделать, прежде чем это вообще сработает, - это вызвать fflush(stdout); перед тем, как вывести из него дескриптор файла stdout.Вероятно, происходит то, что стандартная библиотека C буферизует ваш вывод, не подозревая, что вы перемещаетесь вокруг файловых дескрипторов под ним.Данные, которые вы записываете с использованием printf(), на самом деле не отправляются в базовый дескриптор файла, пока его буфер не заполнится (или ваша программа не вернется из main).

Вставьте вызов какэто:

    fflush(stdout);
    if(dup2(file, 1) < 0) {

перед обоими вызовами на dup2().

3 голосов
/ 24 июля 2011

Ваш второй dup2 звонок неправильный, замените на:

if (dup2(current_out, 1) < 0) {
1 голос
/ 24 июля 2011

Просто замените dup2(current_out, file) на dup2(current_out, 1), и все должно работать лучше.

...