2009-09-04 17 views
6

Come utilizzare il comando fork() in modo da poter generare 10 processi e farli svolgere contemporaneamente una piccola attività.Forcella multipla() Concorrenza

Concorrente è la parola chiave, molte posizioni che mostrano come utilizzare la forcella utilizzano solo una chiamata a fork() nelle loro demo. Ho pensato che avresti usato una sorta di ciclo for, ma ho provato e sembra nei miei test che il fork() sta generando un nuovo processo, sta lavorando, quindi genera un nuovo processo. Quindi sembrano funzionare in sequenza, ma come posso eseguire il fork simultaneamente e avere 10 processi che eseguono il lavoro simultaneamente se questo ha senso?

Grazie.

Aggiornamento: Grazie per le risposte ragazzi, penso di aver appena frainteso alcuni aspetti di fork() inizialmente ma lo capisco ora. Saluti.

+2

BTW-- Ti * veramente * vuole processi (come nel testo) o le discussioni (come nel tag). Se elabora il tag che vuoi è [multiprocessing] – dmckee

+0

sì hai ragione –

risposta

15

chiamata fork() in un ciclo:

codice Aggiunta di aspettare per bambini per i commenti:

int numberOfChildren = 10; 
pid_t *childPids = NULL; 
pid_t p; 

/* Allocate array of child PIDs: error handling omitted for brevity */ 
childPids = malloc(numberOfChildren * sizeof(pid_t)); 

/* Start up children */ 
for (int ii = 0; ii < numberOfChildren; ++ii) { 
    if ((p = fork()) == 0) { 
     // Child process: do your work here 
     exit(0); 
    } 
    else { 
     childPids[ii] = p; 
    } 
} 

/* Wait for children to exit */ 
int stillWaiting; 
do { 
    stillWaiting = 0; 
    for (int ii = 0; ii < numberOfChildren; ++ii) { 
     if (childPids[ii] > 0) { 
      if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { 
      /* Child is done */ 
      childPids[ii] = 0; 
      } 
      else { 
      /* Still waiting on this child */ 
      stillWaiting = 1; 
      } 
     } 
     /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ 
     sleep(0); 
    } 
} while (stillWaiting); 

/* Cleanup */ 
free(childPids); 
+1

Scriverò 'break -> exit' –

+2

oh sicuramente. Altrimenti stai invitando una bomba a forcella limitata. –

+0

Grazie per averlo scoperto. Ho aggiornato. –

3

Basta eseguire il ciclo nel processo "principale" generando un figlio dopo l'altro, assegnando ciascuna un'attività specifica.

4

Quando si esegue il fork dei processi, WILL verrà eseguito contemporaneamente. Nota che, a meno che tu non abbia abbastanza processori in idle disponibili, potrebbero non essere eseguiti contemporaneamente, il che non dovrebbe essere importante ...

Il tuo secondo paragrafo fa sembrare che tu non capisca come funziona la forcella, hai per verificare il codice di ritorno per vedere se ci si trova nella genitrice o nel processo biforcato. Quindi il genitore dovrebbe eseguire un ciclo per distribuire 10 processi e nei bambini si fa tutto ciò che si vuole fare contemporaneamente.