Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Linux - Как послать сигнал процессу из ядра?

552
28 июля 2007 года
Ivanhoe
373 / / 30.04.2006
Хелп_ми_плиз. Допустим, мы знаем PID некоторого процесса. Как из ядра послать ему SIGTERM (да и любой другой сигнал)?

 
Код:
#include <linux/signal.h>

{
    kill(pid, SIGTERM);
}
не работает...

Более того, не работает
 
Код:
#include <linux/syscalls.h>

{
    sys_kill(pid, SIGTERM);
}
361
28 июля 2007 года
Odissey_
661 / / 19.09.2006
Во первых проверь следующие вещи:
Цитата:
Эффективный идентификатор пользователя равен 0 (пример root)
Эффективный или реальный идентификатор пользователя соответствует идентификатору владельца целевого процесса



Если все условия соблюдены. То в случае ошибки kill вернет -1. Описание ошибки можно посмотреть strerror(errno).

Да и прежде чем пробывать это все программно, вызвал бы системную kill -S YOU_SIGNAL PID, может на процессе маска стоит от твоих сигналов.

Во вторых процесс помоему никогда не отмажется от SIGKILL, им и тести =)

552
28 июля 2007 года
Ivanhoe
373 / / 30.04.2006
Эх... да дело в том, что при сборке:
 
Код:
WARNING: "sys_kill" [/home/ivanhoe/devel/mmod/mmod/mmod.ko] undefined!
502
11 августа 2007 года
Jail
550 / / 30.01.2007
Фоновая задача создается во время компиляции (at compile time) для первого CPU; и затем "вручную" размножается для каждого процессора вызовом fork_by_hand() из arch/i386/kernel/smpboot.c. Фоновая задача имеет общую структуру init_task, но для каждого процессора создается свой собственный TSS, в массиве init_tss. Все фоновые задачи имеют pid = 0 и никакой другой тип задач больше не может разделять pid, т.е. не могут клонироваться с флагом CLONE_PID через clone(2).
Потоки ядра порождаются с помощью функции kernel_thread(), которая делает системный вызов clone(2) в режиме ядра. Потоки ядра обычно не имеют пользовательского адресного пространства, т.е. p->mm = NULL, поэтому они явно вызывают exit_mm(), например через функцию daemonize(). Потоки ядра всегда имеют прямой доступ к адресному пространству ядра. Получают pid из нижнего диапазона. Работают в нулевом кольце защиты и, следовательно, имеют высший приоритет во всех операциях ввода/вывода и имеют преимущество перед планировщиком задач.
Пользовательские задачи создаются через системные вызовы clone(2) или fork(2). И тот и другой обращаются к kernel/fork.c:do_fork().
Тут важно понять разницу между пространством уровня пользователя и пространством уровня ядра.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог