Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Отслеживание процесса в unix по имени


Автор: zhekha 29.2.2012, 14:01
Информацию о процессах в системе такие софтинки как ps, top берут из /proc и в случае если последняя не примонтирована, то данные утилитки не работают.

Хочется не зависеть от этого и получить список процессов и параметры этих процессов (интересует имя, пид, статус и виртуальная память)

Нашел описание task_struct и несколько примеров вида
Код

#include <linux/kernel.h>
#include <linux/sched.h>

struct task_struct * find_task_by_name(const char* name) {

    struct task_struct *p;

    for_each_task(p)
        if(strcmp(p->comm, name) == 0) return p;

        return 0;
}

но никак не могу вкурить как заставить это работать и где вообще эти хидеры (sched.h, kernel.h)... 
Такие хидеры есть в /usr/include, но описания struct task_struct в них нету, соответственно компиллятор говорит "error: ‘for_each_task’ was not declared in this scope", хотя на task_struct не ругается...

ОС Ubuntu 10.04 LTS (kernel 2.6.32-38-generic)

Может кто работал с такими штуками?

Автор: boostcoder 29.2.2012, 14:13
это код модуля ядра. соответственно, работать он будет только в качестве модуля ядра.

Автор: zhekha 29.2.2012, 14:23
Т.е. если не модуль ядра - то только парсить /proc ?

А если модуль ядра - то скомпиллировать-то его как?

Второй вопрос снят - нашел (типа make -C /usr/src/linux-2.6.18 SUBDIRS=$PWD modules)

Автор: boostcoder 29.2.2012, 14:31
http://forum.vingrad.ru/forum/topic-340379.html

Автор: zhekha 29.2.2012, 14:49
boostcoder, спасибо!

зы
В очередной раз убеждаюсь, что не очень хорошо умею пользоваться поиском... :'(

Автор: xvr 29.2.2012, 15:46
Цитата(zhekha @  29.2.2012,  14:23 Найти цитируемый пост)
А если модуль ядра - то скомпиллировать-то его как?

А может не стоит? Это всетаки будет часть ядра ОС, а в нем малейшая ошибка не только напечатает вам не то, что хотелось, но и уронит всю машину так, что мало не покажется  smile 
Лучше примонтировать /proc  smile 

Автор: tzirechnoy 29.2.2012, 18:20
Особо тонкие цэнители могут взять подход BSD: открывать /dev/mem (ну, в BSD вроде открывается /dev/kcore -- но у нас без /proc его нету, кажэтся), и в нём на основании знания структуры task_struct и известных символов ядра (хм. insmod ведь их откуда-то вроде получает? файлик ksyms я, опять жэ, видел)напрямую искать эту информацыю.

Но да, развлечение достаточно безсмысленное, а для новичка -- и очень тяжёлое.
Но развлекательное.

Автор: xvr 1.3.2012, 12:11
Цитата(tzirechnoy @  29.2.2012,  18:20 Найти цитируемый пост)
и в нём на основании знания структуры task_struct

Для этого нужно знать точную версию ядра, т.к. эта структура описанна только в кернельных хидерах, и из работающего Linux'а без сорцов ее вытащить неоткуда (ни в /dev ни в /sys ни в /proc ее нет)

Цитата(tzirechnoy @  29.2.2012,  18:20 Найти цитируемый пост)
и известных символов ядра (хм. insmod ведь их откуда-то вроде получает?

insmod этим не занимается - его дело загрузить файл в память и позвать ядро. Линковкой (и извлечением символов) занимается само ядро.
Возможно его символы и можно вытащить, но только через /proc (скорее всего).
 
Цитата(tzirechnoy @  29.2.2012,  18:20 Найти цитируемый пост)
Но да, развлечение достаточно безсмысленное, а для новичка -- и очень тяжёлое.
Но развлекательное. 

Это точно. Вспоминается известный анекдот, про "в гаммаке и стоя"  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)