Как связать stderr с выходным потоком - PullRequest
0 голосов
/ 13 ноября 2018

Когда я пытаюсь получить дескриптор файла для stderr с fileno(stderr), результат равен -2 вместо 2. Документация для fileno говорит, что это, вероятно, потому что в приложении Windows безКонсольное окно stderr не связано с выходным потоком.

Мне нужен stderr дескриптор файла, потому что я бы хотел перенаправить stderr в канал, используя _dup2 () , так что всезаписанные с fprintf(stderr, "...") и std::cerr << "..." будут перенаправлены в канал.

Мой вопрос: возможно ли получить дескриптор файла для stderr в приложении GUI, где нет консольного окна?Могу ли я как-то открыть дескриптор файла stderr по умолчанию перед вызовом fileno(stderr)?

EDIT:
Мне удается заставить его перенаправить fprintf(stderr, "...") в канал, сначала вызвав freopen("temp.txt", "w",stderr), а затем вызвавfileno(stderr) чтобы получить дескриптор файла, основанный на идее, предложенной @ darune.

Я хочу сделать это, потому что я хотел бы перенаправить данные из внешних библиотек, которые не находятся под моим контролем.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

В Unix он работает так, что 2 ссылается на строку 2 в таблице в ядре. Эта запись в таблице может указывать на файл или файл как вещь (сокет, канал, файл, устройство, ничего, ...). Поэтому, если там ничего нет, слот таблицы все равно останется и может быть заполнен новым значением (используя dup?).

Однако это Unix, а Windows от Microsoft - не Unix.

0 голосов
/ 13 ноября 2018

std::cerr может быть перенаправлен внутри вашей программы, но stderr не может (по крайней мере, ни одним портативным или стандартным способом, о котором я знаю).

Сначала вы можете использовать std :: freopen , и после этого можно получить действительный дескриптор файла с помощью std::_fileno(). Этого может быть или не быть достаточно, поэтому, если вам нужно, чтобы что-то еще произошло после этого момента, вы застряли на необходимости контролировать файл изнутри вашей собственной программы (например, ala. Tailing file) и выполнять свою пользовательскую обработку.

...