Сигнал модуля ядра Linux в процессе пользовательского пространства убит

Мне интересно, есть ли хук, который можно использовать в модуле ядра Linux, который запускается, когда приложение/процесс пользовательского пространства уничтожается?


person ZedTuX    schedule 02.03.2013    source источник
comment
Это только для определенного процесса или для всех процессов? Вы заинтересованы в том, чтобы процесс получал определенные сигналы, или процесс просто изящно завершался?   -  person Tuxdude    schedule 02.03.2013
comment
На ARM, #include <asm/thread_notify.h> и thread_register_notifier(). Используйте THREAD_NOTIFY_EXIT. См.: git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/   -  person artless noise    schedule 03.03.2013
comment
@Tuxdude: это для всех процессов и для любых сигналов. В моем случае мой модуль ядра сохраняет некоторые данные на основе PID, и их нужно очищать, как только процесс умирает.   -  person ZedTuX    schedule 03.03.2013
comment
@BillPringlemeir спасибо за это, я смотрю на вашу ссылку и пытаюсь понять, могу ли я что-то сделать с архитектурами, отличными от ARM :)   -  person ZedTuX    schedule 03.03.2013
comment
До сих пор, просматривая исходники ядра, я обнаружил, что в LSM есть хук task_free... но, к сожалению, я не могу его зацепить. Теперь я смотрю на cgroups после просмотра этой ссылки: linux-kernel.2935.n7.nabble.com/. Также я нашел эту ссылку: stackoverflow.com/questions/13863270/ но мне это кажется уродливым :-(.   -  person ZedTuX    schedule 06.03.2013
comment
Другим решением может быть использование inotify в /proc/...   -  person ZedTuX    schedule 06.03.2013
comment
Интересно ... действительно кажется, что do_exit() - это полный беспорядок, потому что все подсистемы, заинтересованные в обработчиках выхода, помещают собственный вызов функции в (длинный) список. Вышеупомянутый ARM вызывается оттуда через exit_thread(), который является выходным хуком для конкретной архитектуры.   -  person FrankH.    schedule 07.03.2013
comment
Хорошо, inotify не может смотреть /proc, так как это не настоящая папка и подпапки, а просто окно со структурами ядра.   -  person ZedTuX    schedule 07.03.2013
comment
Это кажется невозможным... или это никому не нужно было раньше ;-(   -  person ZedTuX    schedule 21.07.2013


Ответы (1)


Вы можете сначала зарегистрироваться для цепочки уведомлений в вашем модуле ядра.

Внутри get_signal_to_deliver(kernel/signal.c) любой процесс, который только (имхо, относительный термин) был убит, имеет свой флаг PF_SIGNALED. устанавливается. Здесь вы можете проверить имя текущего процесса, используя его поле tcomm следующим образом:

char tcomm[sizeof(current->comm)];
get_task_comm(tcomm, current);

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

person HighOnMeat    schedule 15.01.2014
comment
Благодарю вас! Я посмотрю на это! - person ZedTuX; 17.01.2014