2016-04-05 46 views
0

istediğim tek ebeveyn ve 4 oğul ve ben gibi bir şey yazdırmak Bunları oluşturduktan sonra:Aynı ebeveyn için 4 çocuk süreci nasıl oluşturulur ve 4 çocuğun bitmesini bekleyin?

[PID] (parent) with child processes: [PID1] [PID2] [PID3] [PID4] 

ve hepsi bitirmek için üst bekler.

Bu kodu (How to use Fork() to create only 2 child processes?) bir döngüde veya benzer bir şekilde kullanabilir miyim?

 main() 
{ 
    int pid, state, loop1=4, loop2, i=1, j; 
    printf(" Parent before fork()\n"); 
    if ((pid=fork()) !=0) 
    { 
     ParentPID=pid; 
     wait(&state); 
    } 
    else 
    { 
     while(loop1!=0) 
     { 
      execl("child", 0); 
      a[i]=pid; 
      loop1--; 
      i++; 
     } 
    } 
    printf("Parent after fork()\n"); 
    for (j=1; j<i; ++j) 
    { 
     printf ("PARENT_PID:"%d" CHILD_PID[" %d "]= "%d,ParentPID, j, a[i]); 
    } 
    //printf("\tId process child=%d; finished with %d=%x\n",pid,state,state); 
} 

main() 
{ 
    int pid; 
    printf("Child: the execution starts \n"); 
    pid=getpid(); 
    printf("Child: %d execution finished\n", pid); 
    exit(pid); 
} 
+1

Eğer çağırmanız gerekir o zaman X çocukları istiyorsanız [ “fork”] (http://man7.org/linux/man-pages/man2/fork.2.html) Ana işlemde * x kez *. Bunu ayrı ayrı yaparsanız veya bir döngüde farketmezse, önemsiz olan kısım, bunu ana süreçte yapmanızdır. –

+0

Ebeveyn sürecinin "içinde" ile ne demek istiyorsun? Bana bir örnek verebilir misiniz? – Marko

+0

[Çatalın] (http://man7.org/linux/man-pages/man2/fork.2.html) çağrısının ne yaptığını biliyor musunuz? Ebeveyn veya çocuk süreçlerinde olup olmadığınızı nasıl kontrol edeceğinizi (ya da ['fork'] olup olmadığını nasıl kontrol edeceğinizi biliyorsunuz (http://man7.org/linux/man-pages/man2/fork.2.html) başarısız oldu)? –

cevap

2

bir çözüm olabilir:

Bunu başardı fazla bilgi man waipid bakınız için

#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <unistd.h> 

void childFunction(){ 
    printf("Child : %d\n", getpid()); 
    // do stuff 
} 

int main(){ 
    int childLimit = 3; // number of children wanted 
    int childrenPids[childLimit]; // array to store children's PIDs if needed 
    int currentPid, i; 

    for(i=0; i<childLimit; i++){ 
     switch(currentPid = fork()){ 
      case 0: 
       // in the child 
       childFunction(); 
       // exit the child normally and prevent the child 
       // from iterating again 
       return 0; 
      case -1: 
       printf("Error when forking\n"); 
       break; 
      default: 
       // in the father 
       childrenPids[i] = currentPid; // store current child pid 
       break; 
     } 

    } 

    printf("Father : %d childs created\n", i); 

    // do stuff in the father 

    //wait for all child created to die 
    waitpid(-1, NULL, 0); 
} 

;)

+0

"Tüm çocuğun ölmesini bekle" ... TÜM için beklemez, "waitpid()" çağrısı, alt işlemlerden herhangi biri çıktığında döner. –

+0

Bu yanıt, OP'nin – user3629249

+0

@Monstercrunch: istediğini belirttiği satırı vermez. Durum yapısında, sadece varsayılan değerler için currentPid'i yakaladığınızı düşünmüyorum. Doğru hazırlanmış her çocuk için bu bilgiyi istiyorum. Ben childrenPids [i] = currentPid ifadesinin 0 olması gerektiğine inanıyorum. – Marko