Со стороны программы, используйте «тройник»:
# echo foo | tee foo.txt
foo
# cat foo.txt
foo
В самом деле, можно POPEN() канал к тройнику, который записывает файл, хотя это система тяжелый. Что-то по этому поводу:
FILE *stream_to_write_to = popen("tee filename.txt");
fprintf(stream_to_write_to, "goes to filename.txt and stdout\n");
Мне интересно посмотреть, если есть из-C быстрый способ сделать это, потому что на каком-то уровне, это включает в себя копирование данных. Легко получить два дескриптора файла для записи в одно и то же место, использовать dup() или тому подобное, но наоборот более сложно. Это может быть связано с нажатием модуля (общий пример «подключен» к потоку), хотя, честно говоря, я никогда не видел, чтобы это использовалось, поэтому мне бы очень хотелось увидеть образец рабочего кода.
Лучшая рекомендация, которую я могу дать, - «Расширенное программирование в среде UNIX» Стивенса.
Update:
Чтобы поговорить с комментарием АиР ниже, выше решение является немного тяжелее версия только вилка/Exec-ки и перенаправлять ребенка ручки где-нибудь еще. Оба будут решать проблему, хотя я предпочитаю это, потому что ее легче очистить, но, честно говоря, оба решения довольно тяжелые. Вилка() не является легкой функцией. Если дух вопроса заключается в том, чтобы сделать это без fork/exec, то я не уверен, я тоже хотел бы узнать. Если fork/exec в порядке, то напрямую используйте его или используя popen(), он взломает его.
Это репортаж: http://stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout – MasterHD
@MasterHD, вы правы. вероятно, я не искал достаточно тогда. – Framester