2011-02-09 2 views
3

У меня есть приложение Qt, которое запускает несколько детей QProcess, а затем вызывает QProcess::setChannelMode(QProcess::ForwardedChannels). Я хотел бы затем передать stdout этого приложения (теперь содержащий stdout его дочерних элементов) в файл журнала, местоположение которого определяется приложением, что означает, что я не могу просто изменить мой журнал, чтобы также написать указанному файл, потому что это не будет работать для детей, и я не могу запустить app | tee logfile, потому что я не знаю, к чему его обращаться.Вперед stdout к файлу в приложении Qt

Я бы предпочел - если он существует (и я не смог его найти, если он это сделал) - метод для этого через Qt, но другие решения были бы приемлемыми.

ответ

1

Хорошо. В качестве не Qt решения, это выглядит как freopen будет делать то, что мне это нужно, чтобы:

#include <cstdio> 
... 
QString logFile; 
... 
freopen(logFile.toLocal8Bit().data(), "w", stdout); 
+0

Я сомневаюсь, что это сработает, если одновременно будут записывать несколько процессов. функции библиотеки c не предоставляют никакой блокировки, и я сомневаюсь, что базовый OS API предоставит такой механизм блокировки, если специально не будет предложено это сделать. Если это решит вашу проблему, это может случиться так, потому что ваш журнал работает только на низких частотах, поэтому проблемы очень трудно. – smerlin

3

Разве это не просто QProcess :: setStandardOutputFile()?

никогда сожалению никогда на самом деле сделал это сам

+0

Будет ли эта работа для одного файла с несколькими процессами - то есть все, что они смогут записывать в файл и будет их выходы появляются последовательно? – spbots

+0

Возможно, все они записаны в один и тот же файл, но я не знаю, какая базовая блокировка используется - вы можете получать сообщения из процесса, если они запускаются одновременно –

+0

Проблема с методами QProcess - 1) Мне также нужен вывод из исходного приложения, и у меня нет доступа к нему как к QProcess (я не думаю) 2) Я не думаю, что это хорошо играет с несколькими процессами, записывающими в один и тот же файл. – Matt

1

путь, чтобы сделать это было бы изменить лежащую в основе streambuf, так как в этом довольно простом примере: http://www.cplusplus.com/reference/iostream/ios/rdbuf/

не может быть лучший путь, но он выполняет свою работу.

+0

Похоже, что изменение 'std :: cout.rdbuf()' работает только для операций, выполняемых на 'std :: cout' - вывод из printf или дочерних процессов, например, не пересылается. – Matt

+0

@Matt, вызовы 'printf' будут проходить по другому маршруту, выше всего работает только для cout/cerr и т. Д. Вы не получите согласованный вывод до тех пор, пока не реализуете какую-то форму IPC ... (даже с вашим решением« freopen »ниже) К сожалению, если вы хотите писать в один и тот же файл журнала из нескольких процессов, вам необходимо реализовать какую-то форму пользовательского журнала, который работает над сокетом, например, и имеет один процесс, ответственный за запись того, что получено в файл. Вы также можете посмотреть библиотеку ускорения iostreams ... – Nim

Смежные вопросы