Esto parece una pregunta tonta, pero no puedo encontrar la respuesta en cualquier lugar que miro. Sé que en UNIX, las señales se manejan de forma asíncrona. Si escribo una función que maneja una señal, ¿dónde se ejecuta esa función? ¿Se ha generado un nuevo hilo? ¿Se ha interrumpido un hilo existente de alguna manera? ¿O esto se maneja en un hilo del sistema como E/S asíncrona?¿Cómo se manejan las señales asíncronas en Linux?
Respuesta
Un hilo de proceso existente se interrumpe hasta que la función retorna. Existen serias restricciones sobre lo que puede hacer con seguridad para garantizar que no dañe el estado de las llamadas a funciones en las que el hilo estuvo en el medio; específicamente, cualquier función que llame que el hilo ya haya estado llamando debe ser una reentrada asíncrona. Ver las páginas man, p. Ej. señal, sigaction para obtener más detalles o hacer preguntas más específicas a su gusto.
Una función de señal se ejecuta como si se hubiera interrumpido un hilo en el proceso. Es decir, el manejador de señal se llama usando el hilo señalado y la pila se reorganiza para que cuando el manejador de señal regrese el hilo continúe la ejecución. No se introducen nuevos hilos.
No es un hilo por separado, pero su código se suspende apresuradamente. Es por eso que solo un subconjunto limitado de las llamadas POSIX está disponible.
Desde el signal man page:
El manejador de rutina debe tener mucho cuidado, ya que el procesamiento en otros lugares fue interrumpido en algún punto arbitrario. POSIX tiene el concepto de "función segura". Si una señal interrumpe una función insegura y el manejador llama a una función insegura, entonces el comportamiento no está definido. Las funciones seguras se enumeran explícitamente en los diversos estándares.
- 1. trata de señales asíncronas en multihilo Programa
- 2. ¿Cómo se manejan las cadenas en C++?
- 3. ¿Cómo se manejan las interrupciones en SMP?
- 4. ¿Cómo se manejan las funciones cpp?
- 5. Cómo bloquear las funciones asíncronas en JavaScript
- 6. ¿Cómo manejan oozie las dependencias?
- 7. ¿Cómo se manejan las zonas horarias en CFML?
- 8. ¿Cómo se manejan las excepciones "imposibles" en Java?
- 9. ¿Cómo se manejan las pruebas unitarias en F #?
- 10. ¿Cómo se manejan las asociaciones entre los agregados en DDD?
- 11. ¿Cómo se manejan las solicitudes de Ajax en Spring MVC?
- 12. ¿Cómo se manejan las versiones en una aplicación web?
- 13. ¿Hay señales de suspensión/reanudación en Linux?
- 14. cómo determinar el número de señales pendientes en la cola de señales de Unix (Linux)
- 15. Cómo rastrear las señales emitidas en QT?
- 16. ¿Cómo atrapo las señales en PowerShell?
- 17. ¿Cómo se manejan las dependencias 'profundas' con IoC y DI?
- 18. ¿Cómo se manejan las localizaciones dinámicas de sitios?
- 19. ¿Cómo se manejan las principales actualizaciones de marco/dependencia?
- 20. ¿Cómo se manejan las declaraciones 'require (..., fianza)' con ARC?
- 21. ¿Cómo se manejan las tareas de implementación únicas con capistrano?
- 22. diferencia entre las llamadas asíncronas y las llamadas asíncronas en io .net
- 23. ¿Cómo se manejan las OPCIONES HTTP con Spring MVC?
- 24. ¿Cómo se relaciona SIGINT con las otras señales de terminación?
- 25. Python: ¿cómo se diferencian las señales de pubsub?
- 26. Implementación de señales de reloj de hardware en Linux Kernel
- 27. Gestión de señales con varios hilos en Linux
- 28. ¿Cómo se manejan los subproyectos con autotools?
- 29. ¿Cómo se manejan las interrupciones en las máquinas con dos procesadores?
- 30. Python - trampa de todas las señales