Из-за пределов программы, используйте "tee":
# echo foo | tee foo.txt
foo
# cat foo.txt
foo
На самом деле, вы можете открыть () канал для тройника, который записывает файл, хотя это сильно загружает систему.Что-то на этот счет:
FILE *stream_to_write_to = popen( "tee filename.txt" );
fprintf( stream_to_write_to, "goes to filename.txt and stdout\n" );
Мне любопытно посмотреть, есть ли быстрый способ сделать это из-C, потому что на каком-то уровне это предполагает копирование данных.Легко получить два файловых дескриптора для записи в одно и то же место, используя dup () или тому подобное, но обратная сторона более сложна.Это может включать вставку модуля (общий пример - «connld» в поток), хотя, честно говоря, я никогда не видел, чтобы он использовался, поэтому я бы хотел увидеть сам пример рабочего кода.
Лучшая ссылкаЯ могу дать «Расширенное программирование в среде UNIX» Стивенса.
Обновление:
Чтобы поговорить с комментарием R ниже, вышеприведенное решение является несколько более тяжелой версией просто fork / exec-перенаправление ручки ребенка в другое место.И то и другое решит проблему, хотя я предпочитаю вышесказанное, потому что его легче очистить, но, честно говоря, оба решения довольно тяжелые.Fork () не является легкой функцией.Если суть вопроса в том, чтобы сделать это без fork / exec, то я не уверен, я бы тоже хотел знать.Если с fork / exec все в порядке, то использование его напрямую или popen () приведет к его взлому.