Захватите вывод stderr моей программы в Qt

Я пишу приложение Qt GUI, использующее библиотеку libxslt. libxslt всегда выводит ошибки в stderr, но в некоторых случаях пользователю было бы полезно видеть отображаемые сообщения. Есть ли способ захватить вывод stderr и поместить его в QString?


person adam.baker    schedule 20.05.2014    source источник
comment
Вы пробовали QProcess::readStandardOutput()?   -  person lpapp    schedule 21.05.2014
comment
Казалось бы, здесь это не применимо. ОП говорит, что они используют библиотеку в процессе.   -  person nobody    schedule 21.05.2014
comment
См. этот вопрос для тех, кто решает точно такую ​​же проблему в Qt и этой для более общего обсуждения.   -  person nobody    schedule 21.05.2014
comment
@AndrewMedico: вы когда-нибудь использовали его? Я не вижу, где ОП упоминает библиотеку в процессе, что бы это ни значило.   -  person lpapp    schedule 21.05.2014
comment
Я беру написание ... приложения, использующего библиотеку libxslt, в том смысле, что они пишут приложение, которое связывается с библиотекой, а не запускает дочерний процесс.   -  person nobody    schedule 21.05.2014
comment
@AndrewMedico: вы можете запустить свою программу через оболочку? Как это не применимо? Это, пожалуй, самый быстрый и простой способ сделать это.   -  person lpapp    schedule 21.05.2014
comment
Это все в том же процессе. По иронии судьбы, раньше я использовал QProcess для вызова xsltproc, но переключился на использование библиотеки, так как она казалась лучшей формой.   -  person adam.baker    schedule 21.05.2014


Ответы (1)


Есть два быстрых варианта:

1) Оберните свое использование внешним процессом и используйте QProcess .

Это введет внешнюю оболочку. Это не позволит вам обрабатывать ошибку «иногда» навскидку. Для этого вам понадобится внешняя обработка.

QProcess process;
process.start("wrapper");
process.waitForFinished();
qDebug() << process.readAllStandardError();

2) Согласно известному примеру из книги Linux Programming Interface: перенаправить файловый дескриптор stderr (2).

Это немного сложнее, но лучше избегать внешней оболочки процесса. Он также совместим только с posix, поэтому без него может не работать. Если вы планируете использовать msvc, это может стать препятствием. Вам нужно будет написать серверную часть Windows отдельно или использовать mingw.

int pfd[2];
pipe(pfd);
// Do other things here.
close(STDERR_FILENO);
if (pfd[1] != STDERR_FILENO) {
    dup2(pfd[1], STDERR_FILENO);
    close(pfd[1]);
}
read(...);
person lpapp    schedule 20.05.2014
comment
Спасибо. Я хотел избежать использования внешнего процесса. Если вариант (2) включает код, специфичный для компилятора, то я думаю, что было бы лучше создать временный файл, а затем прочитать его. Я рад узнать возможные решения. - person adam.baker; 21.05.2014