El vie, 19-10-2007 a las 12:02 -0300, Leandro Lucarella escribió:
> 
> Otra opción es usar señales. Las señales interrumpen muchas llamadas
> al sistema operativo (entre ellas accept), en general saliendo esas
> llamadas con un error EINTR (de interrupción). Podés "atajar" las
> SIGINT (Ctrl-C) y SIGTERM (kill) para hacer que el programa termine
> correctamente ante esas condiciones y en el stop() mandar un kill(pid,
> SIGTERM) a "mano" para terminar el programa.
> 

No puedo hacer que cancele el accept. La funcion manejadora es

 1   void signal_handler( int num )
 2   {
 3       switch( num ) {
 4           case SIGINT:
 5               std::cout << "Señal = " << num << std::endl;
 6               break;
 7           default:
 8               SIG_DFL( num );
 9       }                      
10   }

y la instalo con las siguientes lineas

    struct sigaction sa;

    sigaction(SIGINT, NULL, &sa);
    sa.sa_flags &= ~SA_RESTART;
    sa.sa_handler = signal_handler;
    sigaction(SIGINT, &sa, NULL);

El mensaje aparece al presionar Ctrl+C o al simularla con
raise( SIGINT ) pero el hilo del socket queda dentro de la función
accept.

Además me confunde un poco el estándar de POSIX que dice "Use of this
function is unspecified in a multi-threaded process." [1]

¿Tendré que usar pthread_kill para enviar la señal al hilo apropiado?

[1]  http://www.opengroup.org/onlinepubs/009695399/functions/signal.html

_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a