Подскажите плиз, кто может.
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(¤t->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