Перенаправить stdout, stderr, cout, cerr в файл, а также на экран
В моем довольно большом консольном приложении C/C++ я хочу перенаправить вывод printf, fprintf(stderr,...), cout и cerr на экран, а также в файл журнала.
Я мог бы сделать что-то подобное, используя "tee" или перенаправив вывод при запуске программы, используя перенаправление ( Как я могу перенаправить и добавить как stdout, так и stderr в файл с помощью Bash?).
Тем не менее, я хочу сделать это программно изнутри моей основной процедуры без изменения существующего кода. Я надеялся добавить некоторый код в начале моей функции main(), чтобы соответствующим образом установить потоки, чтобы все последующие вызовы printf, fprintf(stdout,...), fprintf(stderr,...), cout, cerr и т. д. выведите их вывод на экран как обычно, но также запишите выходной файл в файл.
Может быть некоторая проблема с последовательностью из-за буферизации stdout и не буферизации stderr, но это нормально. Было бы еще лучше, если бы это можно было сделать кроссплатформенным образом.
1 ответ
Это было бы не только проще, но и лучше, если бы пользователь программы мог определять, как перенаправить ввод-вывод программы, а не встраивать его в программу. Если хотите, напишите скрипт-оболочку вокруг двоичного файла, который устанавливает описанные вами перенаправления, чтобы людям не приходилось делать это самостоятельно.
При этом вы можете делать то, что вы описываете программно, по крайней мере, в системе POSIX. Вы должны понимать, однако, что один поток (stdout
Например, соединяет один источник с одним приемником. Чтобы направить один источник на два приемника, вам нужен посредник, такой как tee
команда. Чтобы это было прозрачно для вашего процесса, вам нужно отключить один или несколько других процессов для его обработки, перенаправив стандартный поток вывода основного потока и стандартные ошибки на этот дочерний элемент (ren) по конвейеру. Вы могли бы exec tee
в дочернем процессе (ах), или вы можете свернуть свою собственную реализацию.