2011-07-16 10 views
10

Çatal> exec yordamını kullanarak çok fazla alt işlem oluşturmak istiyorum. Birçok süreç çok hızlı bitiyor (iki dakikadan kısa, hatta daha önce).C: Exec/fork> Geçersiz işlemler

Benim ilk sorun ben Şimdiye kadar

./spawnbot > logging.txt 
[CTRL+Z] 
bg 1 
disown 

ile arka planda çok iyi spawn sürecini koymak vardır. Artık spawnbot’un mesajlarını göremiyorum ve doğrudan logging.txt dosyasına gidiyorum. Bununla birlikte, yeni bir çocuk oluşturulduğunda, o çocuğumla ilgili tüm bilgileri tekrar görüyoruz. Şimdi her çocuğu kendi borusuyla başlatmak istedim - çocukların çıkış mesajlarını her yerde göndermemesinin daha iyi bir yolu var mı? konsol? Sadece/dev/null'a yönlendirmeli miyim yoksa bu C dilinde bir bayrakla mı yapılmalı? İkinci olarak, tüm çocuklar gerçekten ölmezler. Ps -ef'imde çok fazla işlem var. Bununla ilgili ne yapabilirim?

cevap

13

İlk önce ikinci sorunuz! Çekirdek hala onlardan bir dönüş değeri almak isteyebilirsiniz düşündüğü için

Çocuklarınız

Çocuğunuzun süreçlerinden dönüş değerlerini almak için niyeti varsa, belirlesin .. 'zombi' modunda kalmayı SIGCHLD sinyal işleyicisi ana işleminde SIG_IGN ile çekirdek çocuğunuza otomatik olarak yanıt vermesini sağlamak için SIGCHLD sinyal işleyicisini . İlk soru sizin uygulanmasına ilişkin bir it bağlıdır

signal(SIGCHLD, SIG_IGN); 

..

Ancak genel konuşma, sadece dup2() kullanmak sonra 0 ve 1 için eski dosya tanımlayıcıları kapatmak ve close() kullanmalıdır çatal sen() sonra onları istediğiniz değerlere ayarlamak için .. Şu anda bir örnek için zaman yok, ama bu sizi doğru yönde iter umuyoruz ..

13

Ç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.