PDA

View Full Version : [Help C] Server Concorrente


soulbw
06-02-2012, 14:17
Ciao a tutti,
come si implementa un server Concorrente in c? mi spiego meglio, so che si usa la fork per far demandare la gestione di un servizio ad un figlio e rimettere il server in ascolto, ma il mio dubbio sorge nel momento in cui bisogna rilevare la fine del figlio e quindi teoricamente bisogna usare la wait...ma cosi facendo di fatto non perdo la concorrenza?

esempio schema server concorrente:

for(;;)
{
accept....

if(fork()==0)
{
.......gestione servizio
}
wait(); --qui praticamente attendo ogni figlio e allora e' come se fosse sequenziale?
}


se invece faccio cosi

signal(SIGCHILD, funz); // dove fun contiene la wait
for(;;)
accept....

if(fork()==0)
{
.......gestione servizio
}
--alla term del figlio viene emesso SIGCHILD

qui per sempio cosa succede?....e come mettere la wait nel caso precedente ?
e sopratutto chi mi garantisce che per ogni figlio venga eseguita una wait?
cioe' nel caso in cui piu figli terminano insieme che accadde?....







Grazie in Anticipo della Risposta!

british
10-02-2012, 15:49
se invece faccio cosi

signal(SIGCHILD, funz); // dove fun contiene la wait
for(;;)
accept....

if(fork()==0)
{
.......gestione servizio
}
--alla term del figlio viene emesso SIGCHILD

qui per sempio cosa succede?....e come mettere la wait nel caso precedente ?
e sopratutto chi mi garantisce che per ogni figlio venga eseguita una wait?
cioe' nel caso in cui piu figli terminano insieme che accadde?....



Se non ricordo male, nell'handler metti un ciclo in cui richiami la waitpid chiedendole (primo parametro = -1) di attendere la terminazione di qualsiasi figlio e di non bloccarsi se nessuno figlio ha già terminato (opzione WNOHANG mi pare), cicli finchè non ti restituisce 0.

ciao!

pabloski
10-02-2012, 16:12
L'errore sta nel fatto che la wait la stai mettendo nello stesso for dove chiami fork.

Invece devi prima chiamare n volte fork, per creare gli n figli. Poi ti metti in attesa con wait. Occhio che wait ritorna ogni volta che uno dei figli termina e restituisce il pid del figlio terminato. Quindi devi mettere la wait in un ciclo, che termina solo quando tutti i figli sono terminati.

In pratica una cosa tipo


while (figli_terminati != NUMERO_FIGLI) {
fpid = wait(&status);
figli_terminati++;
}


Oppure, come suggerito, usi


fpid = waitpid(-1, &status, WNOHANG);
if (fpid) figli_terminati++;