2009-08-03 22 views
5

Diğer harici işlemleri yürütmek zorunda olan bir program yazıyorum; Şu anda program, süreçlerin komut satırlarını popen aracılığıyla başlatıyor, çıktıları alıyor ve çıkış durumunu pclose ile ele geçiriyor.Popen/pclose için alternatifler?

Neler olup bittiği, hızlı çalışan işlemler için (örn. Başlatılan işlem hataları hızlı bir şekilde) pclose çağrısının çıkış durumunu alamaması (pclose -1, errno ECHILD).

Popen/pclose tipi davranışı taklit etmenin bir yolu var mı, sonuçta "event" işlem sonunu ve sonuçta oluşan dönüş kodunu yakalamayı garanti eden bir yöntem var mı? Özgün yarış koşulundan pclose ve başlatılan sürecin sona ermesiyle nasıl kaçınılırım?

cevap

3

çatal/exec/

popen bekleyin çatal/exec çağrıları basitleştirmek için sadece bir sarıcı. Çocuğun çıktısını almak istiyorsanız, bir boru, çatalı çağırın, çocuğun dosya tanımlayıcılarını boruya kopyalamanız ve sonra yürütmeniz gerekir. Ebeveyn, çıkışı borudan okuyabilir ve çocuğun çıkış durumunu almak için bekletmeyi çağırabilir.

+4

Popen, çatalı olmayan pencerelerde kullanılabilir olduğu için, her zaman bir sarıcı değil. –

+0

Bunu yapmak için kodumu yeniden yazdım (fork/exec/dup/etc.) Ve şimdi waitpid (...) dönen -1/errno = ECHILD üzerinde aralıklı hata alıyorum. Bok. – Joe

+3

Tamam: Bunu çözdüm. Bu kod harika çalışıyor. Popen/pclose ile eski kodum harika çalışıyor. Ne işe yaramazsa, miras aldığım ortak kodda gömülü gizli SIGCHLD işleyicisiydi. OH SNAP. Temel olarak bu işleyiciye karşı bir yarıştaydım (ki bu da sadece waitpid (-1, ...) diye çağırıyordu. Öğrendiği ders: tüm insan sayfalarını oku ve hiçbir şey düşünmeyin! – Joe

1

vfork() ve execv() öğesini kullanabilirsiniz.

İlgili konular