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