Qué constituye asincrónico-seguridad
linux asynchronous (2)
Se dice que solo debe llamar a las funciones de seguridad asincrónica dentro de un manejador de señal. Mi pregunta es, ¿qué constituye asincronous-safeness ? Una función que es a la vez reentrante y segura para subprocesos es asincrónica segura , supongo. ¿O no?
La reentrada y la seguridad del hilo tienen poco o nada que ver con esto. Los efectos secundarios, el estado y la interrupción de esas funciones son hechos que importan.
función asíncrona segura [GNU Pth]
Una función es segura para señales asíncrona o segura para señales asíncronas, si se puede llamar de forma segura y sin efectos secundarios desde un contexto de manejador de señal. Es decir, debe poder interrumpirse en cualquier punto para que se ejecute linealmente fuera de secuencia sin causar un estado incoherente. También debe funcionar correctamente cuando los datos globales pueden estar en un estado inconsistente. Algunas operaciones seguras asincrónicas se enumeran aquí:
- llamar a la función de
signal()
para reinstalar un manejador de señal- Modifica incondicionalmente una variable
volatile sig_atomic_t
(ya que la modificación de este tipo es atómica)- llamar a la función
_Exit()
para finalizar inmediatamente la ejecución del programa- invocar una función de seguridad asincrónica, según lo especificado por su implementación
Pocas funciones son portables asincrónicamente seguras. Si una función realiza cualquier otra operación, probablemente no sea portátilmente asíncrona.
Una regla empírica es esta: solo señale alguna variable de condición del manejador de señal (tal como futex / pthread, despertar el ciclo de epoll, etc.).
ACTUALIZAR:
Como Russian Employed sugirió, incluso llamar a pthread_cond_signal
es una mala idea. eglibc
el código fuente del eglibc
reciente y tiene un par de bloqueo / desbloqueo. Por lo tanto, presentando la posibilidad de un punto muerto. Esto nos deja con pocas opciones para señalar otros hilos:
- Usando
eventfd
. - Cambiando la variable atómica global y esperamos que SA_RESTART no esté configurado y otros hilos verifiquen nuestra atómica.
Para su propio código, sí, el reentrante y el hilo seguro son las características que necesita, ya que, dependiendo de cómo configure su mecanismo de manejo de señal, su manejador de señal puede ser interrumpido por otra señal. En general, intente hacer el menor trabajo posible dentro del controlador de señal. Es probable que lo único que deba hacer sea establecer indicadores para activar un código especial en el flujo normal de su programa.
Para las funciones en el sistema operativo que podría llamar, consulte la man 7 signal
para obtener una lista de lo que es seguro llamar. Tenga en cuenta que malloc()
y free()
no están en la lista. Las API de sincronización pthread tampoco están en la lista, pero creo que algunas deberían ser seguras para llamar, por lo que puede establecer una bandera global de forma segura en un controlador de señal.