Как программно получить информацию о процессе в C / C ++ из системы Solaris? - PullRequest
2 голосов
/ 15 января 2009

Существует ли библиотека C / C ++ и документация о том, как собирать информацию о системе и процессах в Solaris?

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

Спасибо

Редактировать: Было предложено использовать виртуальный каталог / proc для сбора информации, однако это не намного лучше, чем синтаксический анализ инструментов командной строки, в том смысле, что мне нужно реализовать какой-то пользовательского анализа для каждой части данных, которые мне нужны.

Я ищу что-то похожее на библиотеки c для Windows или MacOS, которые предоставляют эту информацию через API систем на основе c, однако мне не повезло с Google.

Ответы [ 5 ]

3 голосов
/ 15 января 2009

Вы можете получить такую ​​информацию с помощью kstat API .

man -s 3KSTAT  kstat

Вы можете увидеть, как он используется в OpenSolaris vmstat и iostat source

Информацию о процессусе я бы посмотрел на ps .

1 голос
/ 15 января 2009

а как же getrusage()?

1 голос
/ 15 января 2009

Solaris имеет виртуальный каталог / proc , который позволяет собирать различную информацию о процессах с использованием функций ввода-вывода файловой системы.

1 голос
/ 15 января 2009

Я бы использовал / proc virutal dir, как предложил CrashWorks. Я сделал это на aux и linux. Стоит помнить одну вещь: когда я использовал каталог / proc в linux, формат файлов менялся от одного ядра к другому.

Я не знаю, какова ситуация на стороне Solaris, но это может означать, что ваше решение не будет переносимым с одной платформы Solaris на другую.

0 голосов
/ 15 января 2009

Я определенно не эксперт по этому вопросу, но я сделал нечто очень похожее для задания в прошлом семестре, когда мы должны были сделать снимки процессов. К сожалению, этот метод требует копаться в ядре, что, вероятно, не то, что вы хотите сделать.

Я нашел эту статью полезной.

В любом случае, вот некоторые фрагменты.

 write_lock_irq(&tasklist_lock);
  for_each_process(task) {

    if (system_or_user == 0)
      print_mem_user(task);
    if (system_or_user == 1)
      print_mem_system(task);
  }
  write_unlock_irq(&tasklist_lock);

Идея, что вам нужно заблокировать некоторые структуры данных, иначе ядро ​​зависнет. for_each_process - это макрос, определенный где-то, но я не помню, как он работает D:

static void print_mem_system(struct task_struct *task)
{
  struct mm_struct *mm;

  if (task -> mm == NULL){ // this is how you distinguish system processes from user processes
    myarraypid[totalnumberofprocesses] = task -> pid; // store process id's into myarraypid[], which you can later copy back to user space for printing/display. Additional information would be found in a "task_struct" which is Linux's implementation of a process. 



  }


}

Некоторые из моих одноклассников использовали разные подходы и погрузились в источник утилиты "ps". Я считаю, что я работал на Linux 2.6.18-92.1.13.e15. Отказ от ответственности: это сработало для меня, но ваш пробег может отличаться. Я вполне могу быть вне стены, и я не хочу вести вас в неправильном направлении.

...