2014-09-25 9 views
5

Ho scritto il seguente programma per capire come funziona la forcella quando chiamata senza wait() o waitpid().: riuso pid

int main() 
{ 
    pid_t childpid; 
    int retval = 0; 
    int i; 
    while(1){ 
     //usleep(1); 
     childpid = fork(); 

     if (childpid >= 0) 
     { 
      i++; 
      if (childpid == 0) 
      { 
       exit(retval); 
      } 
      else 
      { 
       //printf("childpid is %d\n", childpid);      
      } 
     } 
     else 
     { 
      printf("total no. of processes created = %d\n", i); 
      perror("fork"); 
      exit(0); 
     } 
    } 
} 

ecco l'output ho Get->

total no. of processes created = 64901 
fork: Cannot allocate memory 

mi aspettavo il programma di andare avanti come sto uscendo dal processo figlio istantaneamente e fork() dovrebbe riutilizzare i pid dopo pid> pid_max. Perché non succede?

+0

Sono sorpreso che non abbia completamente danneggiato il sistema. Di solito c'è un limite di processo utente in atto per evitare questo tipo di comportamento e bombardamenti a forcella. 'ulimit -u' dovrebbe darti un limite di processo molto ampio sul tuo sistema. questo è un grosso buco nel tuo sistema. –

+0

ulimit -u rivela: 31488. In effetti, il programma viene eseguito anche su tentativi successivi. – Zaxter

risposta

7

I processi figli usciti non rimangono nella tabella dei processi come zombie. I processi di Zombie esistono finché i loro genitori non chiamano wait o waitpid per ottenere il loro stato di uscita. Inoltre, viene mantenuto l'id del processo corrispondente, per evitare che altri processi appena creati possano duplicarlo.

Nel tuo caso, la tabella dei processi diventa troppo grande e il sistema rifiuta la creazione di nuovi processi.

processi che si biforcano e poi non recupero dei loro stato di uscita può essere considerato come una perdita di risorse. Quando il genitore esce, verrà adottato dal processo init e poi raccolto, ma se il genitore rimane attivo per troppo tempo, non vi è alcun modo per il sistema di rimuovere solo alcuni degli zombi, perché si presume che il genitore debba interessarsi a loro in qualche momento tramite wait o waitpid.

1

I processi figlio contengono anche alcune risorse come la memoria. Ma non vengono rilasciati perché il processo padre non può elaborare il segnale SIGCHLD, che verrà inviato dai processi figli quando escono.

Quei processi figlio diventerà zombie.

È possibile utilizzare "ps -aux" per fare uscire quei fd.