Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
passwd *pw;
uid_t uid;
uid = geteuid();
pw = getpwuid(uid);
но всё же C++ полностью включает в себя C, и я думаю что в коде C++ старые функции никто не отменял
но всё же C++ полностью включает в себя C
void f() {}
int main()
{
f(1, 2, 3);
}
f() говорит о том, что в нее можно передать произвольное количество параметров. Если надо сказать, что параметров действительно не должно быть, пишут f(void). В С++ это эквивалентные описания.Теперь его основные возможности определены, и я могу приступать к описанию кода, предупреждаю сразу что код будет работать только в линуксе, так как почти все его возможности основаны на парсинге папки /proc.
void Info::update(), к тому же получение данных вперемешку, объявление переменных и инициализация зачем-то разведены в разные строки, используется два разных способа получения данных в строку в соседних строках (
stream >> str и getline(stream,str), про конструкцию stream >> str;
for(int i = 0; i < 15;i++) stream >> str; и говорить не охота), многие числа вполне логично выносятся в константы (например 1024)… Можно было как-то так (на плюсах давно не кодил, могу где-то ошибиться, константы выносить не стал — не помню правильное написание, поправьте, если что, для меня тут важнее стиль кодирования):
void Info::update() {
ifstream stream("/proc/sys/kernel/hostname");
string str;
getline(stream, str);
hostname->setText("Hostname: " + QString::fromStdString(str));
stream.close();
uid_t uid = geteuid();
passwd *pw = getpwuid(uid);
user->setText("Пользователь: " + QString::fromAscii(pw->pw_name));
struct sysinfo o;
sysinfo(&o);
long up = o.uptime;
int hour = up / 60 / 60;
int min = (up - hour * 60 * 60) / 60;
int sec = ((up - hour * 60 * 60) - min * 60);//в константы, не?
QString e = QString::number(hour) + QString(" h. ") + QString::number(min) + QString(" m. ")
+ QString::number(sec) + QString(" s.");
uptime->setText("Uptime: " + e);
stream.open("/proc/cpuinfo");
for(int i = 0 ; i < 16 ; i++)
stream >> str;
getline(stream, str);
proc->setText("Процессор: " + QString::fromStdString(str));
for(int i = 0 ; i < 7 ; i++)
stream >> str;
freq->setText("Частота: " + QString::fromStdString(str) + " MHz");
stream.close();
cpubar->setValue(getCpuLoad(0.3));
stream.open("/proc/meminfo");
stream >> str; stream >> str;
int totalMemory = atoi(str.c_str());
int gb = (totalMemory / 1024) / 1024;
int mb = (totalMemory - gb * 1024 * 1024) / 1024;
int kb = (totalMemory - (gb * 1024 * 1024 + mb * 1024));//1024 давно в константы просится
if (gb > 0) //с высокой вероятностью будет целое число, в крайнем случае с точностью до мегабайт, поэтому отображаем Mb и Kb только если надо
e = QString::number(gb) + QString(" Gb ");
else
e = QString("");
if (mb > 0)
e += QString::number(mb) + QString(" Mb ");
if (kb > 0)
e += QString::number(kb) + QString(" Kb ");
mem->setText("Оперативная память: " + e);
//выносим в функцию или в цикл, я, для простоты покажу цикл:
int freeMemory = 0;
for (i = 0 ; i < 3 ; i++) {
stream >> str; stream >> str; stream >> str;
freeMemory += atoi(str.c_str());
}
int usedMemory = totalMemory - freeMemory;
gb = usedMemory / 1024 / 1024;
mb = (usedMemory - gb*1024*1024) / 1024;
kb = (usedMemory - ((mb*1024) + (gb * 1024 * 1024)));
if (gb != 0 ) {
e = QString::number(gb) + " Gb " + QString::number(mb) + QString(" Mb ") + QString::number(kb)
+ QString(" Kb");
} else { // а что, если Mb пустое? проще было сделать так же как я с total memory, кстати totalMemory тоже может иметь < Gb.
e = QString::number(mb) + QString(" Mb ") + QString::number(kb) + QString(" Kb");
}
memload->setText("Используемая оперативная память: " + e);
int usage = 100 * usedMemory / totalMemory;
membar->setValue(usage);
}
for(int i = 0; i < 15;i++) stream >> str;
используется только для того чтобы добраться в файле до нужных нам значений.void Info::update()
Объясните по подробнее пожалуйстаifstream stream("/proc/sys/kernel/hostname"); string str;e = QString::number(gb) + QString(" Gb ") + QString::number(mb) + QString(" Mb ") + QString::number(kb) + QString(" Kb");e = QString("%1 Gb %2 Mb %3 Kb").arg(gb).arg(mb).arg(kb);
int hour = up / 60 / 60;
int min = (up - hour * 60 * 60) / 60;
int sec = ((up - hour * 60 * 60) - min * 60);//в константы, не?
QString e = QString::number(hour) + QString(" h. ") + QString::number(min) + QString(" m. ") + QString::number(sec) + QString(" s.");
QTime time_n(0,0,0,0);
QTime uptime = time_n.addSecs(up);
QString e = uptime.toString("hh' h. 'mm' m. 'ss' s.'");
QProcess::execute(«sleep»,QStringList() << QString::number(dt));man 3 sleep
QProcess::execute(«kill», QStringList() << str);man 2 signal
Для завершения процесса я использую программу которая есть во всех линуксах(если в вашем линуксе её нету, то я даже не представляю что это за линукс такой)
$ type kill kill is a shell builtin
QProcess::execute(«kill», QStringList() << str);
man 2 signal
Пишем свой системный монитор (Linux)