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