¿Algo de la SIGPIPE impacto Configuración de TCP?
Pregunta
I probado el mismo testcode (servidor - cliente) en dos sistemas. En una me estoy haciendo un SIGPIPE, en otro que no estoy recibiendo SIGPIPE.
El escenario de prueba es algo así como a continuación:
Cliente
- Conectar a un servidor
- recibir datos de servidor
- Enviar datos
- Cerrar el socket
Servidor
- aceptar la conexión de un servidor
- Enviar datos al cliente
- Recibir datos
- Enviar datos
- Cerrar el socket
En un sistema (cliente y servidor que se ejecuta en el mismo sistema), SIGPIPE está sucediendo al azar en el lado del cliente o servidor.
Sin embargo, en otro sistema, este problema no está sucediendo con el mismo código de prueba.
Me pregunto si tubería rota tiene algo que ver con la configuración de TCP.
Solución
También puede ignorar SIGPIPE del zócalo para Prevenir la caída de la aplicación de este código:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
Cuando sd es Allen en la recepción de SIGPIPEs.
Otros consejos
La señal SIGPIPE
se eleva si se intenta escribir en un socket que el otro extremo ya ha cerrado. Hay una condición de carrera aquí, si un extremo cierra el socket en torno al mismo tiempo que los otros intentos finales para enviar datos - la notificación de cerca podría ser recibido antes o después del envío, por lo que el SIGPIPE
se está produciendo en un entorno de prueba y no el otro.
aplicaciones Generalmente, socket-conscientes deben ignorar SIGPIPE
, y en su lugar sincrónicamente manejar el error EPIPE
resultante de send()
.