LINUX.ORG.RU

lkm не видит signals


0

0

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

int
netf_thread(void *empty)
{
spin_lock_irq( &current->sighand->siglock );
sigfillset( &current->blocked );
siginitsetinv( &current->blocked, sigmask(SIGUSR1) | sigmask(SIGTERM) );
recalc_sigpending();
spin_unlock_irq( &current->sighand->siglock );

daemonize("netf");

do {
set_current_state( TASK_INTERRUPTIBLE );
schedule_timeout( 2 * HZ );

if ( signal_pending( current )) {

# никак не попаду в эту часть кода при посылки сигнала
# через kill -9 <pid>
#
# а также не ловится через вызов:
# kill_proc( thread_pid, SIGTERM, 1 );

}


} } while ( !atomic_read( &f_exit ) );

}

static int __init
init_netf_module(void)
{
init_completion( &thread_complete );
thread_pid = kernel_thread( netf_thread, NULL, CLONE_FS | СLONE_SIGHAND );

if ( thread_pid < 0 ) {
printk("Can't create thread\n");

return -ENOMEM;
}

return 0;
}

static void __exit
cleanup_netf_module(void)
{
atomic_set( &f_exit, 1 );
kill_proc( thread_pid, SIGTERM, 1 );
wait_for_completion( &thread_complete );
}



В чем ошибка ?


-spin_lock_irq( &current->sighand->siglock );
-sigfillset( &current->blocked );
-siginitsetinv( &current->blocked, sigmask(SIGUSR1) | sigmask(SIGTERM));
-recalc_sigpending();
-spin_unlock_irq( &current->sighand->siglock );
-daemonize("netf");
+lock_kernel();
+daemonize("netf");
+allow_signal(SIGUSR1|SIGTERM|SIGKILL);
+unlock_kernel();

mv ★★★★★
()
Ответ на: комментарий от tailgunner

> Фигассе. Что такое SIGKILL для нити ядра?

Сигнал :)

mv ★★★★★
()
Ответ на: комментарий от Shockk

Хммм... У меня struct task_struct *thread = kthread_run(func, 0, "name") и kill_pid(find_vpid(thread->pid), SIGKILL, 1) нормально работают.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

>Фигассе. Что такое SIGKILL для нити ядра?
Просто грохнет процесс без предупреждения?
Могу быть не прав, но, как мне кажется, сигкиил, как и сигстоп, не игнорируется, не перехватываются и не блокируются (за исключением редких случаев), а всегда выполняются их действия по умолчанию, т.е. терминейт.

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

> Просто грохнет процесс без предупреждения?

Нет, пришлёт сигнал.

mv ★★★★★
()
Ответ на: комментарий от tzukko

> сигкиил, как и сигстоп, не игнорируется, не перехватываются и не блокируются

В userspace.

> терминейт

Вот и интересно - что такое forced termination для нити ядра. Но mv как бэ намекает, что нить просто получит извещение "тебе послали сигнал", а обработка этого - на ее усмотрение. Можно вывести в сислог "Бугага, промазал".

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

Ну, вот что говорит ULK:
The SIGKILL and SIGSTOP signals cannot be ignored, caught, or blocked, and their default actions must always be executed. Therefore, SIGKILL and SIGSTOP allow a user with appropriate privileges to terminate and to stop, respectively, every process,[*] regardless of the defenses taken by the program it is executing.
A signal is fatal for a given process if delivering the signal causes the kernel to kill the process. The SIGKILL signal is always fatal; moreover, each signal whose default action is "Terminate" and which is not caught by a process is also fatal for that process. Notice, however, that a signal caught by a process and whose corresponding signal-handler function terminates the process is not fatal, because the process chose to terminate itself rather than being killed by the kernel.

[*] There are two exceptions: it is not possible to send a signal to process 0 (swapper), and signals sent to process 1 (init) are always discarded unless they are caught. Therefore, process 0 never dies, while process 1 dies only when the init program terminates.

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

> Подскажи, куда копать в тему, интересно узнать подробности.

В исходниках, вестимо :) Щас найду...

mv ★★★★★
()
Ответ на: комментарий от Shockk

> Не помогло(

Да, косяк. Сигналы в allow_signal() надо по одной штуке разрешать.

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