PDA

View Full Version : fork() per creare N processi...


Corvo80
26-09-2005, 11:19
Ok l'ultima volta ho preteso troppo ma stavolta vi chiedo un aiuto relativamente semplice. Non mi e'chiaro il funzionamento della fork(), guardate il seguente codice:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define N 2

main()
{
pid_t pid;
int i;

for (i=0; i<N; i++) {
printf("Processo %i forka\n",getpid());
pid=fork();
}

if(pid == 0)
printf("Sono il processo figlio (PID: %d).\n",(int)getpid());
else if(pid>0)
printf("Sono %i, il genitore del processo con PID %d.\n",getpid(), pid);
else
printf("Si e' verificato un errore nella chiamata a fork.\n");
}

Esso dovrebbe generare N processi; in verita', ne genera 2^N e non capisco come mai... Vorrei sapere dove sbaglio e come posso ovviare al problema, senza usare i thread. Grazie.

ilsensine
26-09-2005, 11:29
Perché ogni child riceve una "copia" del ciclo for, e continua esso stesso a forkarsi indipendentemente dal parent. Alla fine dovresti ritrovarti con 2^N processi!

Soluzione:

for (i=0; i<N; i++) {
printf("Processo %i forka\n",getpid());
pid=fork();
if (!pid)
break;
}

Corvo80
26-09-2005, 11:38
Mio salvatore!!! :D

Questo pomeriggio provo...

supersayan
26-09-2005, 18:28
il figlio che viene generato dalla fork è esattamente uguale al padre ed esegue come prima istruzione quella successiva alla fork. siccome tu eri dentro un ciclo for l'istruzione successiva alla fork era l'incremento di i, quindi il test e poi l'esecuzione del corpo del for. questi cavolo di errori mi hanno fatto bestemmiare non poco anche a me... :D

Corvo80
27-09-2005, 10:07
il figlio che viene generato dalla fork è esattamente uguale al padre ed esegue come prima istruzione quella successiva alla fork. siccome tu eri dentro un ciclo for l'istruzione successiva alla fork era l'incremento di i, quindi il test e poi l'esecuzione del corpo del for. questi cavolo di errori mi hanno fatto bestemmiare non poco anche a me... :D

Non li definirei proprio errori, è che non avevo mai capito bene il funzionamento della fork(). Ora credo di aver intuito, grazie a voi... :D