Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ ( Linux ) получить имя процесса по его PID, или по PID получить имя процесса

Автор: carveau 9.12.2009, 9:39

Пишу на Qt программу мониторинга работы Linux серверов, необходимо узнать запущен ли процесс к примеру mysqld .
Может есть в Qt что нибудь что может мне помочь, или какие нибудь linux-вые структуры, которые умеют читать информацию из /proc/pid/cmdline.

Автор: BRE 9.12.2009, 9:43

Цитата(carveau @ 9.12.2009, 9:39) *
Может есть в Qt что нибудь что может мне помочь, или какие нибудь linux-вые структуры, которые умеют читать информацию из /proc/pid/cmdline.

Ты спрашиваешь, как прочесть текстовую строку из файла?
Посмотри на QFile, можно еще посмотреть на QTextStream (но это уже избыточно).

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 9:45

Могу только подсказать прогу где это реализовано qps - посмотри сырцы

Автор: carveau 9.12.2009, 9:49

Цитата(BRE @ 9.12.2009, 10:43) *
Цитата(carveau @ 9.12.2009, 9:39) *
Может есть в Qt что нибудь что может мне помочь, или какие нибудь linux-вые структуры, которые умеют читать информацию из /proc/pid/cmdline.

Ты спрашиваешь, как прочесть текстовую строку из файла?
Посмотри на QFile, можно еще посмотреть на QTextStream (но это уже избыточно).

Нет я не про то как читать из файла. Мне бы хотелось уйти от этого способа, просто по коду это выглядеть будет не красиво, этот вариант я оставляю на последнее если ни получится найти других системных решений.
Я делал это системно под QNX через devctl, но ядра этих двух операционных систем очень сильно отличаются, и в Linux нет таких хедеров...

Цитата(ЙаМайскЫйПчОЛ @ 9.12.2009, 10:45) *
Могу только подсказать прогу где это реализовано qps - посмотри сырцы

исходники qps есть на crossplatform ?

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 11:14

http://ftp.de.debian.org/debian/pool/main/q/qps/qps_1.9.18.6.orig.tar.gz

Автор: carveau 9.12.2009, 11:18

Цитата(ЙаМайскЫйПчОЛ @ 9.12.2009, 10:45) *
Могу только подсказать прогу где это реализовано qps - посмотри сырцы

нашел исходники QPS, она обходит каталог /proc и читает файл cmdline

Цитата(ЙаМайскЫйПчОЛ @ 9.12.2009, 12:14) *
http://ftp.de.debian.org/debian/pool/main/q/qps/qps_1.9.18.6.orig.tar.gz

спасибо ты дал мне ссылку на более новую версию чем скачал я ! счас посмотрим исходники

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 11:30

carveau,

Цитата
нашел исходники QPS, она обходит каталог /proc и читает файл cmdline

Цитата(carveau @ 9.12.2009, 9:39) *
или какие нибудь linux-вые структуры, которые умеют читать информацию из /proc/pid/cmdline.

это плохо???
сайт проекта http://kldp.net/projects/qps/wiki

Цитата(carveau @ 9.12.2009, 9:49) *
Я делал это системно под QNX через devctl, но ядра этих двух операционных систем очень сильно отличаются, и в Linux нет таких хедеров...

ты смотрел в сторону ioctl ?
http://www.qnx.com/developers/docs/6.4.0/neutrino/lib_ref/i/ioctl.html
какую структуру ты использовал под QNX?

Автор: carveau 9.12.2009, 11:36

procfs_debuginfo dinfo;
обходим /proc получаем именя всех папок - эти имена и будут являтся всеми PID запущенных процессов
// DCMD_PROC_MAPDEBUG_BASE - вызов для получения информации, имеющую отношение к пути,
// связанному с процессом, связанным с данным описанием файла
devctl( fd, DCMD_PROC_MAPDEBUG_BASE, &dinfo, sizeof( dinfo ), NULL );
и в dinfo вся информация которая мне нужна.

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 11:50

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
наверно гдето сдесь

Автор: carveau 9.12.2009, 11:56

Цитата(ЙаМайскЫйПчОЛ @ 9.12.2009, 12:50) *
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
наверно гдето сдесь


Спасибо огромное, мельком глянул вторая ссылка должна быть интересной !!! Счас буду пробывать результат сообщу !!!

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 11:59

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>.

Автор: carveau 9.12.2009, 13:54

к сожелению пример использует старые библиотеки и хеадеры, у себя не смог найти запросы битовых констант для ioctl - PIOCPSINFO. . .
находил еще в интернете о <sys/sched.h> там вообще были готовые функции, передаешь параметром имя процесса в функцию а она тебе pid_t сразу....


#define PIOC ('q'<<8)
#define PIOCPSINFO (PIOC|30)

так же находил в инете битовое представление этих констант, подставлял, результата не дало, ioctl возвращал -1

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 14:28

посмотри procfs.h
структура elf_prstatus
поле pr_pid

Автор: carveau 9.12.2009, 14:32

да есть, такое поле, дистрибутив у меня KUbuntu 9.04
счас надо понять каким системным вызовом заполнять ее !!! если все также ioctl такой REQUEST должен быть прошелся по <bits/ioctls-types.h> ничего похожего по смысле не нашел

Автор: Kagami 9.12.2009, 14:38

Мм... а никто еще не предлагал посмотреть исходники утилиты ps?

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 15:00

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;
}

Автор: carveau 9.12.2009, 15:07

да, так точно.
Вижу два варианта решения.
1) по имени процесса получить его PID, если процесса нет то и мы ни какого PID соответственно не получим
2) по PID получить имя процесса, обходим весь каталог /proc/номер - и есть список всех PID - ов в системе

да делать так не нравится, потому что пишу дипломку, и преподователь не оценит легкость решения этой задачи !!!
ДА есть плюс у этого метода, он будет не зависим от возраста линуксовых библиотек !!!

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 15:08

и ты не хочешь пробегать все дерево процессов с целью поиска в cmdline имени процесса??
Хотя мне кажется что это самый прямой способ...
Любое решение которое ты найдешь ИМХО будет основанно на все том же переборе дерева процессов... но будет в красивой(может быть) упаковке в виде системной функции

Автор: carveau 9.12.2009, 15:11

да, потому что все решение сводится к простому чтению из файла ! не оценят !

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 15:13

О_о
Погоня за оценкой не доведет до бобра

Автор: carveau 9.12.2009, 15:15

ну напоследок можно постораться :-)

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 15:19

Ну тогда от меня напоследок http://www.unix.com/high-level-programming/114525-c-process-pid-name.html
запусти ps из своей программы... с ключом поиска по имени и пропарси ввывод ... ))) мы же не ищем легких путей
Удачи

Автор: carveau 9.12.2009, 15:38

Спасибо, в ссылке нашел файлы в которые смотреть надо, а то уже минут 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 <имя_процесса> запускать ....

Автор: ЙаМайскЫйПчОЛ 9.12.2009, 15:38

смирись с этим... и живи счастливо дальше.. пока ты находишься на стадии отрицания

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)