|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Oct 2010
Messaggi: 17
|
[Help C] Server Concorrente
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: Codice:
for(;;)
{
accept....
if(fork()==0)
{
.......gestione servizio
}
wait(); --qui praticamente attendo ogni figlio e allora e' come se fosse sequenziale?
}
Codice:
signal(SIGCHILD, funz); // dove fun contiene la wait
for(;;)
accept....
if(fork()==0)
{
.......gestione servizio
}
--alla term del figlio viene emesso SIGCHILD
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! |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
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! |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
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 Codice:
while (figli_terminati != NUMERO_FIGLI) {
fpid = wait(&status);
figli_terminati++;
}
Codice:
fpid = waitpid(-1, &status, WNOHANG); if (fpid) figli_terminati++; Ultima modifica di pabloski : 10-02-2012 alle 17:16. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:23.




















