Tengo un código que genera un pthread
que intenta mantener una conexión de socket a un host remoto. Si alguna vez se pierde la conexión, intenta reconectarse usando una llamada de bloqueo connect()
en su socket. Dado que el código se ejecuta en un hilo separado, realmente no me importa el hecho de que utiliza la API de socket síncrono.¿Cómo se interrumpe un hilo que realiza una conexión de socket de bloqueo?
Eso es, hasta que llega el momento de que mi aplicación salga. Me gustaría realizar una apariencia de apagado ordenado, así que uso primitivas de sincronización de subprocesos para activar el subproceso y señal para que salga, luego realice un pthread_join()
en el subproceso para esperar a que se complete. Esto funciona muy bien, a menos que el hilo esté en el medio de una llamada connect()
cuando ordeno el cierre. En ese caso, tengo que esperar a que termine el tiempo de conexión, lo que podría ser mucho tiempo. Esto hace que la aplicación parezca tardar mucho tiempo en apagarse.
Lo que me gustaría hacer es interrumpir la llamada al connect()
de alguna manera. Después de que la llamada regrese, el hilo notará mi señal de salida y se apagará limpiamente. Como connect()
es una llamada al sistema, pensé que podría interrumpirla intencionalmente usando una señal (haciendo que la llamada retornara a EINTR
), pero no estoy seguro de si este es un método robusto en un entorno de subprocesos POSIX.
¿Alguien tiene alguna recomendación sobre cómo hacer esto, ya sea mediante el uso de señales o mediante algún otro método? Como nota, la llamada connect()
está caída en algún código de biblioteca que no puedo modificar, por lo que cambiar a un socket no bloqueado no es una opción.
También ponga una etiqueta de idioma. – Tudor
Escribo en Python, pero no estoy buscando nada específico del idioma. Puedes asumir que estoy operando en Linux. –
Cierre el zócalo. –