Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: brwclc от Февраля 28, 2012, 11:05



Название: Как получить результат консольной команды top через QProcess
Отправлено: brwclc от Февраля 28, 2012, 11:05
Задача - считать данные, выдаваемые консольной командой "top" в линуксе, в массив QByteArray. Ниже привожу алгоритм. В результате returnData пустой. Почему не считываются данные с консоли? (Использовал этот алгоритм с другими командами - проблем нет, данные выдаются.)


Код:
QProcess* pConsoleProc = new QProcess;
QByteArray returnData;
QByteArray cmd = "top -n 1\n";

pConsoleProc->start("/bin/sh");

pConsoleProc->waitForStarted();
pConsoleProc->write(cmd);
pConsoleProc->waitForFinished();
pConsoleProc->waitForReadyRead();

returnData = pConsoleProc->readAllStandardOutput();

pConsoleProc->close();
delete pConsoleProc;
return returnData;


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: Пантер от Февраля 28, 2012, 11:08
Потому что top отрисовывает данные. Юзай ps.


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: mutineer от Февраля 28, 2012, 11:10
А почему ты в старт отдаешь /bin/sh, а не сразу top (ну или ps, как советуют)?


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: brwclc от Февраля 28, 2012, 11:13
Можно поподробней, что за "ps" ?


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: mutineer от Февраля 28, 2012, 11:14
Можно поподробней, что за "ps" ?

можно. man ps в консоли


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: brwclc от Февраля 28, 2012, 11:19
Понятно. Информация о процессах как раз мне и не нужна. Из top-а мне нужна информация о CPU, MEM и SWAP.


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: GreatSnake от Февраля 28, 2012, 15:19
Понятно. Информация о процессах как раз мне и не нужна. Из top-а мне нужна информация о CPU, MEM и SWAP.
Мде... Про procfs (http://ru.wikipedia.org/wiki/Procfs) похоже не слышал?
Тогда делай:
Код
Bash
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/swaps


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: brwclc от Февраля 28, 2012, 22:05
Да да... Только вот "cat /proc/cpuinfo" - это общая информация о процессоре. Что не дает обновляемую информацию о его загруженности и работе.

Похоже, придется изучать исходники top... :(


Название: Re: Как получить результат консольной коман&#
Отправлено: brwclc от Февраля 28, 2012, 22:09
Потому что top отрисовывает данные.

Кстати, "top -n 1 > top_log.txt"  тоже не отрабатывается купроцессом. В итоге пустой файл. Получается, не в прорисовке дело.


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: twp от Февраля 28, 2012, 22:31
а какой код используется для запуска top?


Название: Re: Как получить результат консольной коман&#
Отправлено: BRE от Февраля 28, 2012, 22:45
Кстати, "top -n 1 > top_log.txt"  тоже не отрабатывается купроцессом.
Так и должно быть.
Обработкой перенаправление пайпов (> top_log.txt) занимается шел, а его ты как раз не запускаешь. Да?


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: Rem Norton от Февраля 28, 2012, 23:47
Да да... Только вот "cat /proc/cpuinfo" - это общая информация о процессоре. Что не дает обновляемую информацию о его загруженности и работе.

Похоже, придется изучать исходники top... :(
Не все так плохо. Может вот это (http://www.koders.com/cpp/fid75C5EE2AD361E478A0BAE50A60AF474BA56070E1.aspx?s=search) как-то поможет.


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: GreatSnake от Февраля 29, 2012, 14:51
Да да... Только вот "cat /proc/cpuinfo" - это общая информация о процессоре. Что не дает обновляемую информацию о его загруженности и работе.
А что посмотреть что находится в /proc не судьба?
К тому же сам проcил инфу о CPU.
Инфо о загрузке читается из /proc/loadavg либо берётся из getloadavg().

А вот читать вывод top-а, хм...


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: brwclc от Февраля 29, 2012, 15:05
Цитировать
А что посмотреть что находится в /proc не судьба?
К тому же сам проcил инфу о CPU.
Инфо о загрузке читается из /proc/loadavg либо берётся из getloadavg().

А вот читать вывод top-а, хм...

/proc/loadavg
The  first  three  fields  in this file are load average figures
giving the number of jobs in the run queue (state R) or  waiting
 for disk I/O (state D) averaged over 1, 5, and 15 minutes.
// первые три поля - поля средней загрузки, показывающие число работ в рабочей очереди или ждущие ввода/вывода на диск, усредненные за 1, 5 и 15 минут.

И это информация о процессоре в реальном времени? Или Вы серьезно считаете, что я в /proc/ никогда в жизни не заглядвал?  :o

Ладно, проблему временно решил sysstat-ом.


Название: Re: Как получить результат консольной коман&#
Отправлено: brwclc от Февраля 29, 2012, 15:07
Кстати, "top -n 1 > top_log.txt"  тоже не отрабатывается купроцессом.
Так и должно быть.
Обработкой перенаправление пайпов (> top_log.txt) занимается шел, а его ты как раз не запускаешь. Да?

Запуск идет через bash


Название: Re: Как получить результат консольной команды top через QProcess
Отправлено: GreatSnake от Февраля 29, 2012, 15:19
И это информация о процессоре в реальном времени? Или Вы серьезно считаете, что я в /proc/ никогда в жизни не заглядвал?  :o
Загляни ещё раз и увидишь /proc/stat, в котором всё это есть.