LINUX.ORG.RU

task/process statistics through netlink


0

0

Собственно интерисует документация и примеры по сабж'у. Можете что-то подсказать? Заранее спасиба.

PS: /usr/linux/Documentaion/accounting не предлагать, ибо там как-то смутно все описано.


А в чем конкретно проблемма? Напиши, поможем. Там вроде ничего сложного нету. Просто я врде структура со статистикой, ты ее дергаешь и получаешь ее в юзерспейсе. Проще вроде не куда.

anonymous
()
Ответ на: комментарий от anonymous

Ну первое. В доках написано, что инфа отсылается в юзерспэйс после завершения процесса, однако можно и во время его выполнения мониторить. Я что-то не так понял? Ну и во-вторых, в труктуре taskstats есть полк ac_exitcode. Правильно ли я понял, что это код завершения процесса и если да, то как его получить?

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

Угу оно самое stats->ac_exitcode = tsk->exit_code; По идее так-же как написано в getdelays.c. Создаешь сокет, и читаешь отуда, если таск сдохнет, то там будет код возврата.

Возможно можно как-то зарегать обработчик на событие, что таск сдох, и прочитать эту структуру. Но как так с ходу сказать не могу.

anonymous
()
Ответ на: комментарий от anonymous

хмм.. не про тот ли getdelays.c ты говоришь, который в Documentation/accounting лежит. Просто в том, что у меня нет ни малейшего намека на чтение exitcode'а. Более того, как-то он странно работает с ключем -l (loop) - один раз читает и все. Попробовал в цикле снова послать запрос, все норм, пока процесс работает. Как он терминэйтэется, то возвращается ошибка.

П.С. Ядро у меня 2.6.21.1

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

Да именно про этот, а что вообще у тебя выдает t->ac_exitcode ? Например если его печать в функцию void print_delayacct(struct taskstats *t) засунуть?

anonymous
()
Ответ на: комментарий от anonymous

Пробовал. Нолик. Ибо процесс еще не завершен. Заставить получать инфу о завершенном процессе сий getdelays.c я пока не смог.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

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

Собственно как проверить, создать тред в том-же getdelay.c и завершить его. Посмотреть что она вернет до и после.

anonymous
()
Ответ на: комментарий от anonymous

Не знаю понятно ли написал, в общем это не код возврата программы(процесса), а код возврата последней завершенной задачи(таска, треда) в процессе.

anonymous
()
Ответ на: комментарий от anonymous

Хмм.. Не совсем понял. Вот например беру main.c в нем просто return -1. потом main2.c в нем system ("main"); sleep (100); return -1; Потом getdelay -di -p `pidof main2`. Однако код выхода по-прежнему 0.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

Попробуй с fork() вместо system. Просто что-бы он выщел с кодом каким-нибудь, а основаная прога висела. Что-то не нравится мне system в данном случае. Других идей пока нету, будет время глану, самому интересно уже.

anonymous
()
Ответ на: комментарий от anonymous

Уже попробовал. Пошаманил с возвращаемым рез-м фрка (просто почему-то нет мана на него). в какой-то конфигурации стал отличать нулевой и ненулевой. То есть если возвращаешь 0, то и exitcode тоже 0. а вот если возвращаешь не 0, то exitcode не ноль, но другой не ноль.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

Ну отрицательным оно точно не может быть __u32 ac_exitcode; /* Exit status */ С положительными числами по идее должно работать.

anonymous
()
Ответ на: комментарий от anonymous

стояло что-то типа int main () { printf ("Hello, World!\n"); if (fork()) { sleep (100); return 0; } return 100; } exitcode при этом определился вчто-то типа 25300. ну или что-то такое.

Nazgul
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.