Как программно получить информацию о процессе на C / C ++ из системы Solaris?
Вопрос
Существует ли библиотека C / C ++ и документация о том, как собирать системную и обрабатываемую информацию в Solaris?
Хотя я мог бы разобрать инструменты командной строки, я бы предпочел использовать библиотеку, которая упрощает выполнение задачи.
Спасибо
Редактировать: Было предложено использовать виртуальный каталог / proc для сбора информации, однако это не намного лучше, чем синтаксический анализ инструментов командной строки, в том смысле, что мне нужно будет реализовать какой-то пользовательский синтаксический анализ для каждой части данных, которая мне нужна.
Я ищу что-то вроде библиотек c для Windows или macOS, которое предоставляет эту информацию через системный API на основе c, однако мне не везет с Google.
Решение
Вы можете получить такого рода информацию с помощью kstat API - интерфейс.
man -s 3KSTAT kstat
Вы можете увидеть, как это используется в OpenSolaris вмстат и иостат Источник.
Для получения информации о processus я бы посмотрел на ps.
Другие советы
Солярис обладает виртуальный каталог /proc, который позволяет вам собирать всевозможную информацию о процессах, используя функции ввода-вывода файловой системы.
Я бы использовал вирусный каталог /proc, как предложил CrashWorks.Я делал это как на aux, так и на Linux.Следует иметь в виду одну вещь: когда я использовал каталог /proc в Linux, формат файлов варьировался от одного ядра к другому.
Я не знаю, какова ситуация на стороне Solaris, но это может означать, что ваше решение не будет переносимо с одной платформы solaris на другую.
о чем getrusage()
?
Я определенно не эксперт в этом вопросе, но я делал нечто очень похожее для задания в прошлом семестре, когда от нас требовалось делать моментальные снимки процессов.К сожалению, этот метод требует углубления в ядро, что, вероятно, не то, что вы хотите сделать.
Я нашел это Статья полезный.
В любом случае, вот несколько фрагментов.
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.Отказ от ответственности:У меня это сработало, но ваш пробег может отличаться.Я вполне мог бы сойти со стены, и я не хочу вести вас в неправильном направлении.