OSX - это POSIX-системы, и, как и все стандартные системы POSIX, выходной файл представляет собой дескриптор файла STDOUT_FILENO
(который является макросом, определяемым как 1
).
Что вы можете сделать, это duplicateSTDOUT_FILENO
на другой файловый дескриптор, open временный файл и тиражирование (используя dup2
) временный файл как STDOUT_FILENO
. Тогда всякий раз, когда есть выход для стандартного вывода (используя простой write
, C printf
или C++ std::cout
), он будет помещен во временный файл.
Когда выполняется временное перенаправление, вы просто дублируете сохраненный стандартный вывод (с первого вызова dup
) обратно в STDOUT_FILENO
. и закрыть и удалить временный файл.
Что-то вроде следующего:
int saved_stdout = dup(STDOUT_FILENO);
int temp_file = open("/tmp/temp_stdout", O_WRONLY, 0600);
dup2(temp_file, STDOUT_FILENO); // Replace standard out
// Code here to write to standard output
// It should all end up in the file /tmp/temp_stdout
dup2(saved_stdout, STDOUT_FILENO); // Restore old standard out
close(temp_file)
unlink("/tmp/temp_stdout"); // Remove file
Спасибо, что мы попробовали решение. Мы заметили, что при первом запуске кода текст «open log files» исчезает с консоли. Но в следующий раз он остается и прерывает связь с клиентским приложением. Я думаю, что ваш подход обрабатывает все три случая использования stdio; поэтому я ожидал, что это сработает. – barbarossa
Кроме того, если я пишу 'close (STDOUT_FILENO);' или 'fclose (stdout);' текст журнала никогда не печатается. Есть ли способ восстановить stdout позже? – barbarossa
'dup2' сам делает закрытие STDOUT_FILENO внутри функции« Перенаправление ». Правильно ли вы вложили весь вызов в dylib под функциями «Переадресация» и «Восстановить»? – sameerkn