Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    142

    [C] chiudere correttamente un server

    ciao a tutti, sto scrivendo una semplice applicazione client/server, ho fatto in modo che quando si prema ctrl+c sul server (o quando si invia il segnale SIGINT) il server proceda ad effettuare tutte le pratiche per lo spegnimento(deallocazione roba ecc ecc). Mi sono chiesto se è corretto anche chiudere il socket o se non è necessario.

    nel caso sia corretto farlo, nell'hanlder del segnale non posso passare parametri, quindi l'unico modo che hoper chiudere il socket e renderla come var globale, è scorretto? è giusto?

    grazie ciao

  2. #2

    Re: [C] chiudere correttamente un server

    Originariamente inviato da atomico
    quindi l'unico modo che hoper chiudere il socket e renderla come var globale, è scorretto? è giusto?
    No. Innanzi tutto verifica che la tua chiamata bloccante non si sblocchi in automatico alla ricezione del SIGINT. Se non stai effettuando chiamate bloccanti, al limite controllerai un flag globale, mica un socket globale ;-)

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    142
    il server è fermo sull'accept, se premo ctrl+c, fa l'handler e se nn metto l'exit torna sull'accept.

  4. #4
    Originariamente inviato da atomico
    il server è fermo sull'accept, se premo ctrl+c, fa l'handler e se nn metto l'exit torna sull'accept.
    codice:
    $ man 2 accept
    
    ACCEPT(2)                   BSD System Calls Manual                  ACCEPT(2)
    
    NAME
         accept -- accept a connection on a socket
    
    SYNOPSIS
         #include <sys/socket.h>
    
         int
         accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
    ...
    ERRORS
         The accept() system call will fail if:
    
         [EBADF]            socket is not a valid file descriptor.
    
         [ECONNABORTED]     The connection to socket has been aborted.
    
         [EFAULT]           The address parameter is not in a writable part of the user address space.
    
         [EINTR]            The accept() system call was terminated by a signal.
    ...
    dunque c'e' un modo per "sbloccarlo" tramite una signal, magari basta appunto il SIGINT o che ne so prova con altri.
    ;-)

    p.s.
    attento che il valore numerico cambia tra i vari sistemi operativi: per vedere i valori del tuo SO fai un (ad esempio sotto Mac):
    codice:
    $ kill -l
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL
     5) SIGTRAP	 6) SIGABRT	 7) SIGEMT	 8) SIGFPE
     9) SIGKILL	10) SIGBUS	11) SIGSEGV	12) SIGSYS
    13) SIGPIPE	14) SIGALRM	15) SIGTERM	16) SIGURG
    17) SIGSTOP	18) SIGTSTP	19) SIGCONT	20) SIGCHLD
    21) SIGTTIN	22) SIGTTOU	23) SIGIO	24) SIGXCPU
    25) SIGXFSZ	26) SIGVTALRM	27) SIGPROF	28) SIGWINCH
    29) SIGINFO	30) SIGUSR1	31) SIGUSR2

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.