Pregunta

Estoy escribiendo un servidor muy simple que se repite para siempre hasta que se presiona Ctrl-C. Me gustaría que el controlador de señal para ctrl-c cierre los sockets abiertos y apague el servidor, pero no sé cuál es el alcance de un controlador de señal, y no me gusta la idea de declarar el socket (s) Necesitaría cerrar para ser global.

¿Alguien puede ofrecer sugerencias? ¿Hay alguna forma estándar de hacer esto?

¿Fue útil?

Solución

Bueno, como tienes manejadores de señal, voy a asumir que estás en una variante de Unix. Si es así:

  • Un socket se identifica con el kernel por el número de archivo, que es un int. Consulte socket (2) .
  • Que int es válido para su proceso
  • Ese int es válido para cualquier proceso bifurcado después de crearlo
  • Si no es close-on-exec, es válido para cualquier proceso que ejecute.

Entonces, es perfectamente válido en su controlador de señal. Cómo hace que su manejador de señales sepa qué número usar depende del idioma en el que está escribiendo, que no especificó. Hay dos enfoques que funcionarán en casi cualquier idioma

  • Si no tiene que realizar ninguna limpieza, excepto close y salir, simplemente llame a exit. O configure la acción de la señal como predeterminada, que es salir. El núcleo cerrará los sockets.
  • Establezca una bandera (que generalmente será global de algún tipo) para indicarle a su ciclo de selección / sondeo que limpie y salga. Ventajoso porque no tiene que preocuparse por si es seguro llamar a varias partes de su programa desde un controlador de señal.

Otros consejos

Normalmente, es aconsejable no hacer mucho en un controlador de señal; aparte de establecer una bandera.

Luego, cuando el control regrese a su bucle principal, puede examinar esta bandera, salir del bucle, cerrar sockets, ejecutar destructores en sus objetos, etc., y salir limpiamente.

Los manejadores de señal pueden ser llamados casi en cualquier momento, incluso en medio de llamadas a la biblioteca C o C ++, lo que podría ser un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top