Çocuk süreçleriniz öldürülüyor. Defunct processes da zombie processes; zombiler öldü! Bir zombi işlemi, işlem tablosundaki bir girdiden başka bir şey değildir, herhangi bir kod veya belleğe sahip değildir. Bir işlem ölürse (_exit
numaralı telefonu arayarak veya bir sinyalle öldürülürse), üst tarafından bir araya getirilmesi gerekir. İşlem tablosundaki girdiden başka işlem tarafından kullanılan her kaynak kaybolur. Ebeveyn, wait
veya waitpid
'u aramalıdır. Ebeveyn, çocuğun sürecinin ölümünden haberdar edildikten ve çocuğun çıkış durumunu okuma şansına sahip olduğunda, çocuğun işlem tablosundaki girişi de ortadan kalkar: zombi toplanır.
Çocuklarınızın ölümünden asla haberdar edilmek istemiyorsanız, SIGCHLD
sinyalini dikkate almayın; Bu, çekirdeğe, çocuklarınızın kaderini bilmek istemediğinizi söyler ve zombi otomatik olarak toplanır.
signal(SIGCHLD, SIG_IGN)
sadece belirli durumlarda çocuklarınızın ölümlerin bildirilmesini istiyorsanız
,
SA_NOCLDWAIT
bayrağıyla
sigaction
diyoruz. Bir çocuk öldüğünde, ebeveyn
wait
işlev ailesinden birini yürütüyorsa, çocuğun ölümüyle ilgili bilgilendirilir ve çıkış durumuna söylenir; aksi halde çocuğun çıkış durumu iptal edilir.Açıkça (
close
ve
open
veya
dup
veya diğer olasılıklar bir dizi) onları yönlendirdim sürece çıkış İlişkin
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
, çocuklarınız ebeveyn olarak aynı yerlere yazın. Çocuklarınız muhtemelen hata mesajlarını standart hataya yazdırıyorlar (sonuçta bunun için de öyle). Eğer terminalden çocukları ayırmak istiyorum görünüyor çünkü ek olarak
./spawnbot >logging.txt 2>&1
, muhtemelen terminali öldürürsem bir SIGHUP almazlar emin olmak istiyorum. Yani nohup
:
nohup ./spawnbot >logging.txt 2>&1 &
disown
kullanın.