Я видел фрагменты разбросанной информации, но, похоже, я не могу получить окончательный ответ. Как вы очищаете зомби-поток в ядре?
Чтобы убедиться, и вы получите окончательный правильный способ обработки потоков в ядре, я хотел бы задать этот вопрос более широко. Как вы создаете, завершаете и очищаете поток в ядре Linux?
Что я до сих пор знаю:
thread_func:
exited = 0;
while (!must_exit)
do stuff
exited = 1;
do_exit(0)
init_module:
must_exit = 0;
exited = 1;
kthread_run(thread_func, ...) /* creates and runs the thread */
cleanup_module:
must_exit = 1;
while (!exited)
set_current_state(TASK_INTERRUPTIBLE);
msleep(1);
/* How do I cleanup? */
Ближайшая вещь, которую я нашел для решения очистки, - release_task, но я нигде не говорил об этом. Я представил себе, поскольку функции потока kthread_create
, kthread_run
и т.д., Должны быть kthread_join
или kthread_wait
, но не было. do_wait
также показался вероятным, но он не принимает struct task_struct *
.
Кроме того, я не уверен, что do_exit
является хорошей идеей или, если она вообще необходима. Может ли кто-нибудь придумать минимальный очерк о том, как создать, прекратить и очистить kthread?