Mis preguntas son:Determinar si una función es asíncrona entre señal y caja de seguridad (se puede llamar dentro de un manejador de señales)
- ¿Hay una manera de determinar de manera concluyente si una función es asíncrona señal segura si no tiene acceso a su implementación?
- Si no es así, ¿hay alguna manera de comprobar si la función sería lo suficientemente segura para la señal asíncrona como para llamar desde un manejador de señal?
Si lee las páginas man de signal() o sigaction(), obtendrá una lista de funciones async-signal-safe (funciones que se pueden llamar de manera segura dentro de un manejador de señal). Sin embargo, creo que esta lista no es exhaustiva. Por ejemplo, la siguiente página http://linux.die.net/man/7/signal, bajo la funciones asíncrono señal-seguras cabecera, se lee:
POSIX.1-2004 (también conocido como POSIX.1-2001 Corrigendum técnico 2) requiere una aplicación a garantizar que las siguientes funciones se pueden llamar de forma segura dentro de un manejador de señales:
Y luego se procede a enumerar las funciones asíncrona de señales de seguridad normales que figuran en las páginas man anteriores. Cuando lo leí, dice "requiere", no "estos son los únicos".
Por ejemplo, this site dice que back_trace_symbols_fd() es una señal asíncrona segura. Esa función obtiene datos de dladdr() y no usa malloc() como back_trace_symbols(), por lo que parece que puede ser seguro. Además, realicé algunas pruebas, y la estructura de salida de dladdr() contiene variables char *, pero NO están malloc en tiempo de ejecución. La cadena de caracteres a la que apuntan existe en tiempo de ejecución incluso antes de llamar a dladdr().
Cualquier pensamiento o idea que pueda apuntarme en la dirección correcta es apreciado.
No olvides votar las respuestas útiles a tus preguntas o aceptar la respuesta más útil para cada una de tus preguntas. Si no está seguro, consulte las [FAQ] (http://stackoverflow.com/faq) y especialmente [¿Cómo hago preguntas aquí?] (Http://stackoverflow.com/faq#howtoask) –