LINUX.ORG.RU

Kernel thread destroy


0

0

Подскажите плиз, кто может.

void start_kthread(void (*func)(kthread_t *), kthread_t *kthread) { init_MUTEX_LOCKED(&kthread->startstop_sem); kthread->function = func; kthread->tq.sync = 0; INIT_LIST_HEAD(&kthread->tq.list); kthread->tq.routine = kthread_launcher; kthread->tq.data = kthread; schedule_task(&kthread->tq); down(&kthread->startstop_sem); }

void stop_kthread(kthread_t *kthread) { if(kthread->thread == NULL) { /* printk("stop_kthread: killing non existing thread!\n");*/ return; } lock_kernel(); init_MUTEX_LOCKED(&kthread->startstop_sem); kthread->terminate = 1; kill_proc(kthread->thread->pid, SIGKILL, 1); down(&kthread->startstop_sem); unlock_kernel(); kill_proc(2, SIGCHLD, 1); }

void init_kthread(kthread_t *kthread, char *name) { lock_kernel(); kthread->thread = current; siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM)); init_waitqueue_head(&kthread->queue); kthread->terminate = 0; sprintf(current->comm, name); unlock_kernel(); up(&kthread->startstop_sem); }

void exit_kthread(kthread_t *kthread) { lock_kernel(); kthread->thread = NULL; mb(); up(&kthread->startstop_sem); }

И собственно вопрос. У меня в драйвере в процессе работы создается нить - start_kthread, в функции она инициализаруется init_kthread(), а потом я хочу из нити выйти.

Если я выхожу через exit_kthread, или stop_kthread и exit_kthread, то она выпадает с состояние DW или Z(Зомби) по top, т.е. реально не убивается.

Подскажите плиз, как правильно выйти из нити? Код функций взят из http://www.scs.ch/~frey/linux/kernelthreads.html

★★★

Буду разбираться позже, щас буду в сон кидать на секунду, если простаивает.

Надо кому-нибудь инфа, как это сделать корректно, или все знают или не используют такое?

Spectr ★★★
() автор топика

если вы отaорматируете, это можно будет прочитать.
если это можно будет прочитать, кто-нибудь, возможно,
и ответит.

> выпадает с состояние DW или Z(Зомби) по top,
> т.е. реально не убивается.

нет, раз Z, то убивается реально. parent должен сделать
wait4(). нужно было daemonize(), тогда бы этим занялся
init.

> Подскажите плиз, как правильно выйти из нити?

единственный способ завершить процесс в Linux, это
если он _сам_ сделает do_exit().

если вы пишете для 2.6, там появились helpers для
работы с kthread, см. include/linux/kthread.h,
ими лучше и пользоваться.

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

Спасибо за совет.

До 2.6 пока руки не дошли, скоро попробую - учту :)

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

>нет, раз Z, то убивается реально. parent должен сделать
>wait4(). нужно было daemonize(), тогда бы этим занялся
>init.
а не reparent_to_init? ;)

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

> а не reparent_to_init? ;)

daemonize() делает еще и другие полезные вещи:
exit_mm(), exit_fs() ...

но, конечно, reparent_to_init() достаточно, чтобы
отдаться иниту, а в 2.4 и необходимо, т.к. не 
зовется из daemonize().

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

idle:

Ну да... мой ответ больше ориентировался на 2.4.

Насчет полезных вещей в большинстве случаев ты прав, но иногда бывает полезно иметь свою fs и files в ядреной нитке. :)

Особенно, если заниматься dirty хаками. :)

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