2013-10-19 48 views
29

Birinin, çatal üstünden devam etmeden önce ebeveynin TÜM çocuk süreçlerinin tamamlanmasını beklemesi için biraz ışık tutabileceğini umuyorum. Çalışmak istediğim temizlik kodum var ama bu süreçten önce çocuk süreçlerinin geri dönmesi gerekiyor.Tüm çocuk süreçleri için ebeveyn bekletme yap

for (int id=0; id<n; id++) { 
    if (fork()==0) { 
    // Child 
    exit(0);  
    } else { 
    // Parent 
    ... 
    } 
    ... 
} 
+2

Sen çocuk ne zaman çıkıldı ve hangi veriyorsan pids Görevinizdeki özellikle yararlı tüm bu çatalları döndü bulacaksınız. Aksi takdirde 'n' zamanları için wait()'. – WhozCraig

cevap

24

POSIX bir işlevi tanımlar: wait(NULL);. waitpid(-1, NULL, 0); için kestirme bir işlem olup, herhangi bir alt işlem çıkana kadar arama işleminin yürütülmesini askıya alır. Burada, 1.'un 1 numaralı argümanı, herhangi bir alt işlemin bitmesini bekleyin.

Sizin durumunuzda, ebeveynin onu else şubenizden çağırmasını sağlayın. Böyle Kullanım waitpid'e

+0

Ur yanıtlarınız için teşekkürler. Çocuk olmayan bölümüne bekle (NULL) ekledim ve program sadece kilitleniyor ve alt işlem bile yürütmüyor mu? – Donatello

+1

OH, Hata() ile yapılan bir hata değil. Tam kodunuzu, hata ayıklamam için izin vermelisiniz. Kod çok basit, sadece bir model. – longdeqidao

+7

'wait' manpage, çocukların ** bir ** inin bitmesini beklediğini söylüyor. @WhozCraig'in yukarıda belirttiği gibi 'n' kez 'beklemek' gerekir. –

19

():

pid_t childPid; // the child process that the execution will soon run inside of. 
childPid = fork(); 

if(childPid == 0) // fork succeeded 
{ 
    // Do something 
    exit(0); 
} 

else if(childPid < 0) // fork failed 
{  
    // log the error 
} 

else // Main (parent) process after fork succeeds 
{  
    int returnStatus;  
    waitpid(childPid, &returnStatus, 0); // Parent process waits here for child to terminate. 

    if (returnStatus == 0) // Verify child process terminated without error. 
    { 
     printf("The child process terminated normally.");  
    } 

    if (returnStatus == 1)  
    { 
     printf("The child process terminated with an error!.");  
    } 
} 
+2

Bu, tüm çocukların tamamlanmasını beklemez. bir çocuk childPid. Daha fazla süreç varsa bu işe yaramaz. – JH95

+1

Elbette, tek bir ebeveyn işleminden birden fazla iş parçacığı oluşturursanız, bu örneği buna göre değiştirmeniz gerekecektir. Birkaç çatalla bir örnek vermek cevabımı kafa karıştırıcı hale getirebilirdi. –

+1

Ebeveynlerin TÜM çocukların bitirmesini beklemesi için bu kodu nasıl değiştirirsiniz? – OutFall

27
pid_t child_pid, wpid; 
int status = 0; 

//Father code (before child processes start) 

for (int id=0; id<n; id++) { 
    if ((child_pid = fork()) == 0) { 
     //child code 
     exit(0); 
    } 
} 

while ((wpid = wait(&status)) > 0); // this way, the father waits for all the child processes 

//Father code (After all child processes end) 
+1

Çok yardımcı. Teşekkürler! –

+0

Sadece bu keskin nişancı benim için çalıştı ... TEŞEKKÜRLER. – PMateus

İlgili konular