Пишу на Qt программу мониторинга работы Linux серверов, необходимо узнать запущен ли процесс к примеру mysqld .
Может есть в Qt что нибудь что может мне помочь, или какие нибудь linux-вые структуры, которые умеют читать информацию из /proc/pid/cmdline.
Могу только подсказать прогу где это реализовано qps - посмотри сырцы
http://ftp.de.debian.org/debian/pool/main/q/qps/qps_1.9.18.6.orig.tar.gz
carveau,
procfs_debuginfo dinfo;
обходим /proc получаем именя всех папок - эти имена и будут являтся всеми PID запущенных процессов
// DCMD_PROC_MAPDEBUG_BASE - вызов для получения информации, имеющую отношение к пути,
// связанному с процессом, связанным с данным описанием файла
devctl( fd, DCMD_PROC_MAPDEBUG_BASE, &dinfo, sizeof( dinfo ), NULL );
и в dinfo вся информация которая мне нужна.
http://www.phy.ohiou.edu/cgi-bin/man-cgi.sol?core+4
prpsinfo_t
http://www.computing.net/answers/unix/get-memory-and-cpu-using-proc/1550.html
наверно гдето сдесь
prstatus_t
The entry containing this structure has a NOTE type of
1. This structure contains things of interest to a
debugger from the operating system's u-area, such as
the general registers, signal dispositions, state, rea-
son for stopping, process ID and so forth. The
prstatus_t structure is defined in <sys/procfs.h>.
к сожелению пример использует старые библиотеки и хеадеры, у себя не смог найти запросы битовых констант для ioctl - PIOCPSINFO. . .
находил еще в интернете о <sys/sched.h> там вообще были готовые функции, передаешь параметром имя процесса в функцию а она тебе pid_t сразу....
#define PIOC ('q'<<8)
#define PIOCPSINFO (PIOC|30)
так же находил в инете битовое представление этих констант, подставлял, результата не дало, ioctl возвращал -1
посмотри procfs.h
структура elf_prstatus
поле pr_pid
да есть, такое поле, дистрибутив у меня KUbuntu 9.04
счас надо понять каким системным вызовом заполнять ее !!! если все также ioctl такой REQUEST должен быть прошелся по <bits/ioctls-types.h> ничего похожего по смысле не нашел
Мм... а никто еще не предлагал посмотреть исходники утилиты ps?
carveau, давай ещё раз тебе по имени процесса надо узнать работает он или нет?
И делать так тебе не нравиться?
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv)
{
if (argc < 2)
{
fprintf(stderr, "Usage: %s <process name>\n", argv[0]);
return 1;
}
const char* directory = "/proc";
size_t taskNameSize = 1024;
char* taskName = calloc(1, taskNameSize);
DIR* dir = opendir(directory);
if (dir)
{
struct dirent* de = 0;
while ((de = readdir(dir)) != 0)
{
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
continue;
int pid = -1;
int res = sscanf(de->d_name, "%d", &pid);
if (res == 1)
{
// we have a valid pid
// open the cmdline file to determine what's the name of the process running
char cmdline_file[1024] = {0};
sprintf(cmdline_file, "%s/%d/cmdline", directory, pid);
FILE* cmdline = fopen(cmdline_file, "r");
if (getline(&taskName, &taskNameSize, cmdline) > 0)
{
// is it the process we care about?
if (strstr(taskName, argv[1]) != 0)
{
fprintf(stdout, "A %s process, with PID %d, has been detected.\n", argv[1], pid);
}
}
fclose(cmdline);
}
}
closedir(dir);
}
// just let the OS free this process' memory!
//free(taskName);
return 0;
}
да, так точно.
Вижу два варианта решения.
1) по имени процесса получить его PID, если процесса нет то и мы ни какого PID соответственно не получим
2) по PID получить имя процесса, обходим весь каталог /proc/номер - и есть список всех PID - ов в системе
да делать так не нравится, потому что пишу дипломку, и преподователь не оценит легкость решения этой задачи !!!
ДА есть плюс у этого метода, он будет не зависим от возраста линуксовых библиотек !!!
и ты не хочешь пробегать все дерево процессов с целью поиска в cmdline имени процесса??
Хотя мне кажется что это самый прямой способ...
Любое решение которое ты найдешь ИМХО будет основанно на все том же переборе дерева процессов... но будет в красивой(может быть) упаковке в виде системной функции
да, потому что все решение сводится к простому чтению из файла ! не оценят !
О_о
Погоня за оценкой не доведет до бобра
ну напоследок можно постораться :-)
Ну тогда от меня напоследок http://www.unix.com/high-level-programming/114525-c-process-pid-name.html
запусти ps из своей программы... с ключом поиска по имени и пропарси ввывод ... ))) мы же не ищем легких путей
Удачи
Спасибо, в ссылке нашел файлы в которые смотреть надо, а то уже минут 40 ползаю по этим исходникам )))
int read_cmdline(char *restrict const dst, unsigned sz, unsigned pid)
{
char name[32];
int fd;
unsigned n = 0;
dst[0] = '\0';
snprintf(name, sizeof name, "/proc/%u/cmdline", pid);
fd = open(name, O_RDONLY);
if(fd==-1) return 0;
**********************************
так же сделано cmdline читает !!! да не может быть что бы в Linuxe небыло чего нибудь такого API - шного что бы без чтения cmdline обойтись !!!
если уж блин не суждено тогда вообще через QProcess сделаю, буду pidof <имя_процесса> запускать ....
смирись с этим... и живи счастливо дальше.. пока ты находишься на стадии отрицания
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)