Ho visto frammenti di informazioni sparse tutt'intorno, ma non riesco a ottenere una risposta definitiva. Come si pulisce un thread di zombi nel kernel?Modo corretto di gestire i thread nel kernel?
Giusto per essere sicuro, e produrre un modo corretto finale di gestire i thread nel kernel, vorrei fare questa domanda in modo più ampio. Come si crea, si termina e si ripulisce un thread nel kernel di Linux?
Quello che ho finora è questo:
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? */
La cosa più vicina che ho trovato per la soluzione di pulizia è release_task, ma non ho trovato da nessuna parte parlarne. Ho immaginato poiché le funzioni thread sono kthread_create
, kthread_run
ecc., Ci dovrebbe essere un kthread_join
o kthread_wait
, ma non c'era. do_wait
sembrava anche probabile, ma non ci vuole un struct task_struct *
.
Inoltre, non sono sicuro se do_exit
sia una buona idea, o se del tutto necessaria. Qualcuno può per favore presentare lo schizzo minimo di come dovrebbe essere creato, terminato e ripulito un kthread?
Mi sembra di ricordare che c'è un kthread_stop o kthread_should_stop, qualcosa del genere. –
@MartinJames, il modo in cui ho capito, o esci tu stesso (usando 'do_exit') o sondare' kthread_should_stop' finché qualcuno ('cleanup_module') chiama' kthread_stop'. Non ho trovato da nessuna parte che dicesse se 'kthread_stop' ripulisce o meno il thread. Ciò che mi meraviglia è che, se le persone (su internet) suggeriscono di usare "do_exit" o altro, non dovrebbe esserci un modo per ripulire il thread dopo "do_exit"? – Shahbaz
A proposito, [questo] (http://lwn.net/Articles/65178/) è ciò di cui parlo quando dico che non riesco a raggiungere una risposta definitiva. Ci sono molte cose contrastanti là fuori. – Shahbaz