Внутренний захват / перенаправление stdout? - PullRequest
5 голосов
/ 02 сентября 2011

Это похоже на вопрос о вычислительных системах 101, но я в тупике.

Я интегрирую существующий код из C / C ++ проекта A в мой собственный проект B. И A, и B будутсвязаны в один исполняемый, потоковый процесс.Код проекта А широко использует printf для вывода.Это хорошо, но я также хочу записать этот вывод в мои собственные буферы.Есть ли способ, которым я могу читать из stdout после того, как вызовы printf записали в него?Я не могу раскошелиться на процесс или трубу.И мои попытки опроса () stdout или dup () не увенчались успехом (возможно, я что-то здесь не так делаю).

Ответы [ 4 ]

4 голосов
/ 02 сентября 2011

Вы можете использовать freopen для изменения дескриптора.

#include<stdio.h>

main(int argc, char** argv) {
    FILE *fp = freopen("output.txt", "w", stdout);
    printf("Hello\n");
    fclose(fp);
}

Если вы запустите его, вы увидите вывод printf в output.txt, и на ваш экран ничего не попадет.

Теперь вы можете открыть файл для чтения данных или даже mmap поместить его в свое пространство памяти и обработать его таким образом.

2 голосов
/ 02 сентября 2011

Перед тем как выполнить printf (), вы можете закрыть fd 1 и dup2 () канал, который вы создали в fd 1.

1 голос
/ 20 июля 2012

Не говоря уже о том, что теперь есть удобная библиотека исходного кода U-Streams C, которая делает перенаправление stdout и stderr довольно тривиальным.И вы даже можете очень легко перенаправить их на несколько направлений.И вы можете создавать свои собственные потоки, кроме того, их можно использовать точно так же, как ведут себя stdout и stderr.

Ищите библиотеку U-Streams C ... действительно удобно.

0 голосов
/ 02 сентября 2011

Как только оно вышло, оно ушло.Если вы хотите скомпилировать все это в один исполняемый файл, вам придется пройти через код для A с поиском, заменить и заменить все эти printf вызовы на вызовы в свой собственный поток, где вы можете скопировать их, а затемпередать их на стандартный вывод.

...