freopen не пишет в указанный файл

Я пытаюсь перенаправить вывод stdout и stderr с помощью файла. Я использую freopen, и он создает файл в правильном каталоге, но файл пуст. Когда я закомментирую код для перенаправления stdout и stderr - вывод отобразится на консоли.

Вот код:

freopen(stderrStr.c_str(), "a+", stderr); //where stderrStr and stdoutStr are the path/file name
freopen(stdoutStr.c_str(), "a+", stdout);

fclose(stdout); 
fclose(stderr);

Я поместил printf("Я РАБОТАЮ") в main и без подавителя, который он выводит, но не буду записывать в файл.

1 ответ

Решение

Чтобы сделать то, что вы пытаетесь сделать, я использую dup2 (2).

Просто откройте (2) два файла fd1 и fd2 и затем используйте dup2(fd1, 1) для выхода и dup2(fd2, 2) для стдерр.

ОС (libc, загрузчик или ядро, не знаю, какой) устанавливает 3 открытых дескриптора файла перед вводом main:

0 : stdin pipe
1 : stdout pipe
2 : stderr pipe

и из документов dup2:

dup2 (int oldfd, int newfd) делает newfd копией oldfd, при необходимости сначала закрывая newfd

поэтому два вызова dup2 заменяют 1 и 2 открытыми файлами. Поэтому после того, как ваш процесс вызовет write (2) (системный вызов всех выходных подпрограмм, таких как вызовы printf и cout) в fd 1 или fd 2, данные будут записаны в ваши файлы, а не в каналы, установленные ОС

примечание к справочной странице:

справочные страницы представлены в главах. запись foo(N) означает справочную страницу с именем "foo" в главе N. Чтобы открыть foo(N), введите:

$ man N foo

например, чтобы открыть тип записи (2):

$ man 2 write
Другие вопросы по тегам