freopen не пишет в указанный файл - PullRequest
2 голосов
/ 29 марта 2012

Я пытаюсь перенаправить вывод 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 («Я РАБОТАЮ") в основном и без подавителя выводит, но не записывает в файл.

1 Ответ

3 голосов
/ 29 марта 2012

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

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

ОС (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, данные будут записаны в ваши файлы, а не в каналы, настроенныесправочная страница OS

справочной страницы :

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

$ man N foo

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

$ man 2 write
...