[Socket C ]Server Multiprocesso

di il
7 risposte

[Socket C ]Server Multiprocesso

Vorrei un consiglio! ....quale potremme essere uno schema di un Server Multiprocesso !?

Cioe' per esempio:

 for(;;)
 {
     accept()......
    if(fork()==0)
   {
       servizio
   }
  wait();
}

Solo che in questo schema ho sequenzializzato tramite la wait... quindi se io modifico lo schema cosi

for(;;)
 {
    
    if(fork()==0)
   { 
       accept()......
       servizio
   }
  -- aggancio segnale SIGCHILD con handler contenente la wait

pero' cosi facendo non ho sempre la possibilita' di avere Zombie? o mi sbaglio?
Non so se mi sono spiegato?

7 Risposte

  • Re: [Socket C ]Server Multiprocesso

    Utilizzando i segnali puoi intercettare eventuali cadute del client ma sulle fork dovresti memorizzare una lista si struct di connessioni con il pid generato ed eliminare solo il processo defunto. A quello scopo dovresti utilizzare un socket non bloccate.
    Molto più semplice la prima soluzione, dove non e' necessario sbloccare il socket e si controlla in lettura/scrittura utilizzando il timeout di sistema.
    Come lettura di codice ti potrei consigliare wget, dove i segnali usano una tecnica particolare di 'peeking'.
  • Re: [Socket C ]Server Multiprocesso

    Grazie intanto per aver risposto!!!!
    non sai percaso dove potrei trovare il codice di riferimento per l'implementazione con la lista?

    ho letto di una funzione pid_t waitpid(pid_t pid, int *status, int options) con options WNOHANG ma non ho ben capito cosa si intende con: previene il blocco sulla wait!!
    Quindi in sostanza se io dichiarassi una lista semplice nel server che non ha altro che una catena di pid dei processi allocati potrei in sostanza essere sicuro della "morte" di tutti i figli o no?:P

    principalmente ho un dubbio se io ho un server cosi schematizzato
    
    funz()
    {
      wait....
    }
    /****corpo server****/
     signal(SIGCHILD, funz); // dove fun contiene la wait
    for(;;)
       accept....
       
       if(fork()==0)
       {
          .......gestione servizio
       }
       --alla term del figlio viene emesso SIGCHILD **
    


    in questo caso non mi e' chiaro se il padre si blocca cmq anche se la wait e' nell'Handler di gestione per SIGCHILD o cosi facendo il padre non viene bloccato!! o il tutto equivale a mette qui**
    una bella wait!!!



    grazie in anticipo per la risposta!!
  • Re: [Socket C ]Server Multiprocesso

    Ad esmpio per la waitpid un gestore cosi fatto:
    
    void gestore(int signo) {
    pid_t pid;
    int stat;
    while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
    printf("Figlio %d terminato, con lo stato di %d\n",pid,stat);
    }
    }
    
    puo' rappresentare una valida soluzione?
    magari utilizzandola cosi:
    
    signal(SIGCHILD, gestore); // dove fun contiene la wait
    for(;;)
      
       
       if(fork()==0)
       { 
                 accept....
          .......gestione servizio
       }
       --alla term del figlio viene emesso SIGCHILD 
    
    se l'opz mi consente di non attendete...sempre che per non attendere non si intende che i figli vengono ignorati..

    scusa per tutte queste le domande ma l'argomento e' un po MISTICO!!! ehehehehe
  • Re: [Socket C ]Server Multiprocesso

    non sai percaso dove potrei trovare il codice di riferimento per l'implementazione con la lista?
    io sono un antifork per natura, mi viene sempre da ragionare a blocchi anche se il dati dei child sono visti dai singoli processi ad uso esclusivo. Comunque per lista intendevo una semplice lista concatenata. Fork si o fork no la lista rimane per un'idea di aggragazione... tutto qua!.Nel tuo caso implica aggiungere del codice a quello che hai già scritto.
    ho letto di una funzione pid_t waitpid(pid_t pid, int *status, int options) con options WNOHANG ma non ho ben capito cosa si intende con: previene il blocco sulla wait!!
    A questa domanda non so risponderti. Da quello che so, il socket può essere bloccato o sbloccato, le vie di mezzo non le conosco. Puoi comunque sempre provare e poi giusto 'per' fammi sapere.
  • Re: [Socket C ]Server Multiprocesso

    Kk!!! Grazie mille! mi metto all'opera vedo cosa partorisco:p
  • Re: [Socket C ]Server Multiprocesso

    Ciao ixamit!! Allora ho fatto le varie prova !! Effettivamente questa funziona bene nei casi di un Server sempre in servizio.....elimina il problema Zombie...piu che altro il ciclo permette di evitare casi limite del tipo: due figli muoiono contemporaneamente e viene emesso un solo SIGCHLD.... bisogna essere parecchio sfornutati ma sai com'e' mai sfidare la sorte heeheehehehe

    void gestore(int signo) {
    pid_t pid;
    int stat;
    while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
    printf("Figlio %d terminato, con lo stato di %d\n",pid,stat);
    }
    }
  • Re: [Socket C ]Server Multiprocesso

    Grazie per la segnalazione
Devi accedere o registrarti per scrivere nel forum
7 risposte