2010-12-11 11 views
5

bu benim biçerdöverine olarak How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?wait()/waitpid() 1 değerini döndürür, çocuğun pid'i değil, nasıl düzeltilir?

takip olduğunu(), ben en üst pid çocuk (burada olmayan acımasız bir kelime) bitirmek üzeredir ulaşmaya çalışıyorum. ama bekle() çocuğun pidini döndürmez; bunun yerine 1 döndürür. Herhangi bir yerde 1 değeri için bir belge bulamıyorum. Herhangi bir kafa?

void reaper(int sig) 
{ 
    int status, killedpid; 

    while(killedpid = (/*waitpid(-1, &status, WNOHANG)*/wait(&status)) >= 0) 
    { 
     printf("reaper %d killed %d\n", getpid(), killedpid); 
    } 
} 

Benim sonuçları:

reaper 5933 killed 1 //actual child pid is 5936 

şimdiden teşekkür ederiz!

+0

Oh, terminolojiyle devam edelim diyorum. Bu, nix'in eğlencesinin bir parçası. "Çocuk öldü ve ebeveyn zombi sürecine girdi." – Thanatos

cevap

13

Bu şartlı hata klasik atama - (karşılaştırma yüksek olduğundan precedence sonra atama) ekspresyon şu şekilde değerlendirilir: killedpid bir GERÇEK bir değer alacak

if (killedpid = (wait(&status) >= 0)) { ... 

, 1 olan C. Bu kullanım parantez etrafında almak ve yüksek uyarı seviyelerine-Wall -pedantic gibi derlemek:

if ((killedpid = wait(...)) >= 0) { ... 
+0

İçgörü için çok teşekkür ederim! –

+0

Aynı şey PHP için de geçerlidir. Pcntl_waitpid() 'yi kullandım ve her zaman '1' olarak görünmesi için dönüş değerine neden olan aynı hatayı aldım. – Marki555