Определить информацию о процессе программно в Darwin / OSX - PullRequest
15 голосов
/ 21 октября 2008

У меня есть класс со следующими функциями-членами:


/// caller pid
virtual pid_t Pid() const = 0; 

/// physical memory size in KB
virtual uint64_t Size() const = 0;  

/// resident memory for this process
virtual uint64_t Rss() const = 0; 

/// cpu used by this process
virtual double PercentCpu() const = 0; 

/// memory used by this process
virtual double PercentMemory() const = 0; 

/// number of threads in this process
virtual int32_t Lwps() const = 0; 

Задача этого класса - возвращать информацию о процессе вызывающей стороне. Размер физической памяти может быть легко определен с помощью вызова sysctl, и pid тривиален, но остальные вызовы ускользнули от меня, за исключением вызова popen на ps или top и парсинга вывода - что неприемлемо. Любая помощь будет принята с благодарностью.

Требования:
Компилируется на g ++ 4.0
Нет obj-c
OSX 10.5

Ответы [ 5 ]

12 голосов
/ 21 октября 2008

Информация о процессе поступает с pidinfo:

cristi:~ diciu$ grep proc_pidinfo /usr/include/libproc.h

int proc_pidinfo(int pid, int flavor, uint64_t arg,  void *buffer, int buffersize);

загрузка процессора происходит от host_statistics:

cristi:~ diciu$ grep -r host_statistics /usr/include/

/usr/include/mach/host_info.h:/* host_statistics() */

/usr/include/mach/mach_host.defs:routine host_statistics(

/usr/include/mach/mach_host.h:/* Routine host_statistics */

/usr/include/mach/mach_host.h:kern_return_t host_statistics

Для получения более подробной информации, ознакомьтесь с источниками top и lsof, они с открытым исходным кодом (вам необходимо зарегистрироваться в качестве разработчика Apple, но это бесплатно):

https://opensource.apple.com/source/top/top-111.20.1/libtop.c.auto.html

Позднее редактирование: Все эти интерфейсы зависят от версии, поэтому необходимо учитывать это при написании производственного кода (libproc.h):

/*
 * This header file contains private interfaces to obtain process information.
 * These interfaces are subject to change in future releases.
 */
7 голосов
/ 21 октября 2008

Поскольку вы говорите, что Objective-C отсутствует, мы исключим большинство платформ MacOS.

Вы можете получить процессорное время, используя getrusage (), которое дает общее количество пользовательского и системного процессорного времени, отведенного вашему процессу. Чтобы получить процент загрузки процессора, вам нужно снимать значения getrusage один раз в секунду (или какими бы гранулярными вы ни были).

#include <sys/resource.h>

struct rusage r_usage;

if (getrusage(RUSAGE_SELF, &r_usage)) {
    /* ... error handling ... */
}

printf("Total User CPU = %ld.%ld\n",
        r_usage.ru_utime.tv_sec,
        r_usage.ru_utime.tv_usec);
printf("Total System CPU = %ld.%ld\n",
        r_usage.ru_stime.tv_sec,
        r_usage.ru_stime.tv_usec);

В структуре getrusage есть поле RSS, но в MacOS X 10.5 оно всегда равно нулю. Майкл Найт написал в блоге несколько лет назад сообщение о том, как определить RSS.

2 голосов
/ 13 мая 2013

Вы можете использовать код ниже для информации о процессе в Mac OS:

void IsInBSDProcessList(char *name)    { 
  assert( name != NULL); 
  kinfo_proc *result; 
  size_t count = 0; 
  result = (kinfo_proc *)malloc(sizeof(kinfo_proc)); 
  if(GetBSDProcessList(&result,&count) == 0) { 
    for (int i = 0; i < count; i++) { 
      kinfo_proc *proc = NULL; 
      proc = &result[i]; 
      }
  } 
  free(result);
}

Структура kinfo_proc содержит всю информацию о process.such как идентификатор процесса (pid), группа процессов, статус процесса и т. д.

2 голосов
/ 21 октября 2008

Я думаю, что большинство из этих значений доступны в Mach API, но я уже давно там разбирался. В качестве альтернативы вы можете просто посмотреть исходный код команд "ps" или "top" и посмотреть, как они это делают.

0 голосов
/ 21 октября 2008

Большая часть этой информации может быть получена из GetProcessInformation () .

Кстати, а зачем использовать виртуальные методы для функций, которые возвращают информацию по всему процессу?

Это УГЛЕРОД и не будет работать с какао

...