2012-02-13 15 views
5

enter image description hereNon capisco questo diagramma di fork()

Come possiamo ottenere questo processo con questa condizione ?? schema di processo?

int main (int argc, char **argv) { 
    int i; 
    int pid; 
     for (i= 0; i < 3; i++) { 
      pid = fork(); 

      if (pid < 0) break;// with this condition i dont understand?? 

     } 
      while (wait(NULL) != -1); 
+3

se questo è #homework, contrassegnarlo come tale –

+0

La funzione si chiama "fork", non "fork"; Ho corretto il titolo. –

risposta

8

fork() divide un processo in due e restituisce 0 (se questo processo è il figlio), o il PID del figlio (se questo processo è il genitore), o -1 se la forcella non è riuscita. Quindi, questa linea:

if (pid < 0) break; 

Says "uscire dal ciclo se non siamo riusciti a creare un processo figlio".

Il diagramma è un po 'di confusione a causa del modo in cui i processi (cerchi) corrispondono alle chiamate fork() nel ciclo. I tre processi figlio del processo principale vengono creati quando i è 0, 1 e 2 rispettivamente (vedere lo schema in fondo a questo post).

Poiché il ciclo continua sia il genitore che il processo figlio dal punto forcella è stato chiamato, questo è come le forche avvengono:

  • i == 0: forcella è chiamato nel genitore originale. Ora ci sono due processi (quello superiore e quello sinistro).
  • i == 1: fork viene chiamato nei due processi esistenti. I nuovi bambini sono il bambino più a sinistra sul secondo livello dal basso e il bambino medio sul terzo livello dal basso. Ora ci sono quattro processi
  • i == 2: il fork viene chiamato in tutti i processi esistenti. Nuovi bambini sono tutti i nodi rimanenti (il nodo inferiore, i due nodi più a destra nel secondo strato della borrom, e il nodo più a destra nel terzo strato dal basso)
  • i == 3: Tutti 8 processi uscire dal ciclo

Ecco lo schema di nuovo, con i numeri che indicano quale sia il valore di i era in ciclo quando il processo è stato creato:

    -1 <--- this is the parent that starts the loop 
      / | \ 
      0 1 2 
     /\ | 
      1 2 2 
      | 
      2 
2

fork restituisce -1 se la chiamata a forcella non è riuscita. restituisce il pid in genitore e 0 nel bambino. La condizione che stai osservando non ha importanza per il funzionamento del codice; sta solo dicendo se c'è un errore con fork, quindi esci dal ciclo. Se non vi sono errori nella chiamata a forcella, verrà costruita la struttura del processo nel diagramma.

Il motivo è che lo stesso ciclo continuerà a essere eseguito nei processi figli. Quindi i bambini continueranno anche a biforcare in base al valore di i al momento della chiamata di fork.

3

Per capire il diagramma si deve fare affidamento sul comportamento della fork: si divide il processo in due, creando un altro processo identico al primo (ad eccezione del PID) in una nuova posizione di memoria.

Se lo si chiama in un ciclo che è quello che succede:

Quando sarà diviso i=0 il primo processo, creando un altro processo che iniziare a correre esattamente da questo punto in poi (così sarà saltare il primo ciclo). Concentrandosi sul primo processo, continuerà il ciclo, generando un altro processo quando i=1.Il secondo processo, quindi, inizierà da i=1, quindi salterà i primi due cicli. Il primo processo verrà diviso l'ultima volta per i=2. L'ultima copia creata, tuttavia, inizierà a essere eseguita da i=2, quindi uscirà dal ciclo e non genererà nulla.

La prima copia creata avvierà il ciclo da i=1, generando due processi, mentre la seconda copia inizierà da i=2, generando solo una copia.

È possibile continuare questo ragionamento e comprendere il resto del diagramma.

Come altri hanno sottolineato, if (pid < 0) è solo un controllo per vedere se ci sono errori e non modifica la logica del codice.

2

fork restituisce -1 in caso di errore e 0 o positivo, quindi la riga if (pid < 0) break; indica "se si è verificato un errore, esci dal ciclo".

Supponendo che non v'è errore, è qualcosa di simile:

All'inizio, i=0, e si dispone di un unico processo. chiamiamolo p0.

Nella riga fork();, p0 viene creato un altro processo. chiamiamolo p1.

In ognuno di essi, abbiamo i++ (quindi ora i è 1) e stiamo ripetendo di nuovo il ciclo.

p0 e p1, separatamente, avere un comando fork();, in modo che ognuno di essi crei un altro processo. chiamiamo i nuovi processi p2 e p3.

Ora, in ogni processo, abbiamo i++, che imposta i su 2 e eseguiamo nuovamente il ciclo.

Ognuno dei 4 processi che abbiamo, esegue la linea fork(); e crea un nuovo processo. così ora abbiamo anche p4, p5, p6, p7.

Ogni processo aumenta il suo i a 3 e quindi, poiché la condizione del ciclo è ora falsa, il ciclo termina.

Ora, il processo 8 arriva (separatamente) alla riga successiva.

(Infatti, ogni iterazione il doppio del numero di processi, quindi se cambiare il 3, ad esempio, 15, si avrà 2^15 processi alla fine.)

Problemi correlati