2013-10-01 24 views
11

Credo che questo crei 24 processi; tuttavia, ho bisogno di verifica. Queste domande spesso mi bloccano. Grazie per l'aiuto!Quanti processi vengono creati con queste istruzioni fork()?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    if (pid == 0) 
    { 
    fork(); 
    } 
    fork(); 
    return 0; 
} 
+2

Inserisci printf, quindi compila ed eseguilo e vedrai. –

risposta

22

È abbastanza facile ragionare su questo. La chiamata fork crea un processo aggiuntivo ogni volta che viene eseguita. La chiamata restituisce 0 nel nuovo processo (bambino) e l'ID del processo del bambino (non zero) nel processo originale (genitore).

pid_t pid = fork(); // fork #1 
pid = fork();  // fork #2 
pid = fork();  // fork #3 
if (pid == 0) 
{ 
    fork();   // fork #4 
} 
fork();    // fork #5 
  1. Fork # 1 crea ulteriori processi. Ora hai due processi.
  2. Fork # 2 viene eseguito da due processi, la creazione di due processi, per un totale di quattro.
  3. Fork # 3 viene eseguito da quattro processi, la creazione di quattro processi, per un totale di otto. La metà di quelli ha pid==0 e la metà ha pid != 0
  4. La forcella # 4 viene eseguita dalla metà dei processi creati dalla forcella # 3 (quindi, quattro di essi). Questo crea quattro processi aggiuntivi. Ora hai dodici processi.
  5. La forcella n. 5 viene eseguita da tutti e dodici i processi rimanenti, creando altri dodici processi; ora ne hai ventiquattro.
+7

'fork()' potrebbe anche non riuscire a restituire '-1', quindi potresti probabilmente dichiarare che ci sono 'non più' di 24 processi, non 'esattamente' 24. – mbaitoff

+2

impressionante: D, dovresti essere un insegnante. – roottraveller

1

lei ha ragione. È 24. Appena compilato ed eseguito w/printf prima dell'istruzione return finale. Hai 24 righe di output.

2

Calcolare in questo modo:

Iniziare con 1 (processo principale) e per ogni forcella farlo due volte se la forcella non è all'interno se (pid == 0) altro aggiungere 1/2 della corrente processo al numero corrente di processo.

Nel codice: 1P La forcella numero 1() ha raddoppiato il numero corrente di processi. Ora una nuova serie di processo 2P

Got # 2 fork() in modo da raddoppiare il numero attuale dei processi. Ora una nuova serie di processo 4P

Got # 3 fork() in modo da raddoppiare il numero attuale dei processi. Ora una nuova serie di processo 8P

Got # 4 fork() ma aspettare è in se la condizione in modo (8 + 4 = 12) P

Got # 5 fork() in modo da raddoppiare l'attuale numero di processi. Ora nuovo numero di processi 24P

Problemi correlati