Перенаправление стандартного вывода в C, а затем сбросить стандартный выход

StackOverflow https://stackoverflow.com/questions/6805600

  •  25-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать перенаправления в 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;
}
Это было полезно?

Решение

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

if (dup2(current_out, 1) < 0) {

Другие советы

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

Вставьте звонок таким образом:

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

Перед призывом к dup2().

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top