crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> ( Linux ) получить имя процесса по его PID, или по PID получить имя процесса
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 9.12.2009, 11:59
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


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
Сообщение #12


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 9.12.2009
Пользователь №: 1292

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


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

так же находил в инете битовое представление этих констант, подставлял, результата не дало, ioctl возвращал -1
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 9.12.2009, 14:28
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


посмотри procfs.h
структура elf_prstatus
поле pr_pid
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
carveau
  опции профиля:
сообщение 9.12.2009, 14:32
Сообщение #14


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 9.12.2009
Пользователь №: 1292

Спасибо сказали: 0 раз(а)




Репутация:   0  


да есть, такое поле, дистрибутив у меня KUbuntu 9.04
счас надо понять каким системным вызовом заполнять ее !!! если все также ioctl такой REQUEST должен быть прошелся по <bits/ioctls-types.h> ничего похожего по смысле не нашел
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 9.12.2009, 14:38
Сообщение #15


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Мм... а никто еще не предлагал посмотреть исходники утилиты ps?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 9.12.2009, 15:00
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


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
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 9.12.2009
Пользователь №: 1292

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

да делать так не нравится, потому что пишу дипломку, и преподователь не оценит легкость решения этой задачи !!!
ДА есть плюс у этого метода, он будет не зависим от возраста линуксовых библиотек !!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 9.12.2009, 15:08
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


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

Сообщение отредактировал ЙаМайскЫйПчОЛ - 9.12.2009, 15:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
carveau
  опции профиля:
сообщение 9.12.2009, 15:11
Сообщение #19


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 9.12.2009
Пользователь №: 1292

Спасибо сказали: 0 раз(а)




Репутация:   0  


да, потому что все решение сводится к простому чтению из файла ! не оценят !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 9.12.2009, 15:13
Сообщение #20


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


О_о
Погоня за оценкой не доведет до бобра
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 19:59