2012-01-26 5 views
5

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)

  1. ¿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?
  2. 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.

+2

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) –

Respuesta

4

Si no tiene acceso a la implementación de la función, puede consultar la página del manual. Si la página del manual no dice que es async-safe, y el estándar POSIX no dice que es async-safe, la única conclusión segura es "no es async-safe" (junto con "no lo use")

No existe una forma 100% confiable para comprobar si una función es asincrona. Recuerde, las pruebas solo pueden mostrar la presencia de errores, no su ausencia (Dijkstra). El mero hecho de que no logra hacer cosquillas a la función para que se comporte mal puede significar simplemente que su prueba no es adecuada (pero tenga la seguridad de que el cliente importante que no puede permitirse ofender ideará de forma inmediata y accidental una devastadoramente efectiva prueba que demuestra que la función no es asíncrona casi tan pronto como libera el código con la suposición errónea).

+0

This El enfoque es bastante frustrante, ya que, por ejemplo, 'strlen' y' memcpy' no están garantizados como señal segura. Pero solo tiene que vivir con eso, nunca se sabe cuándo una chispa brillante va a inventar una 'memcpy' fabulosamente optimizada que realmente no es reentrante.De todos modos, el estándar C dice que las funciones de la biblioteca en general no pueden ser llamadas desde manejadores de señal (async-signal-unsafe simplemente dice que no se puede llamar desde un controlador para una señal que interrumpió otra función insegura, pero eso es algo complicado para obtener alguna ventaja). –

+0

@SteveJessop strlen() no está definido como async-signal-safe en la página man de sigaction(), pero puede implementar su propia versión que sea async-signal-safe. Todo lo que hace es contar los caracteres no NULL y cuando alcances NULL devolver ese valor. – Roberto

+0

@JonathanLeffler ¿Sabes por qué algunas páginas man especifican seguridad de hilo y seguridad de señal mientras que otras no? Supongo que debería seguir las páginas man de mi propio sistema operativo. Algunas páginas man especifican una función de atributos (5) (no estoy seguro de si es una función) que especifica todo esto y más. ¿Sabes cómo acceder a eso? Consulte la página de manual de ejemplo: http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?dladdr+3 – Roberto

0

¿Qué esperas lograr con el manejador de señal? Debes considerar si es el lugar correcto para ello. Probablemente sea mejor seguir el consejo de la página man:

In general, signal handlers should do little more 
than set a flag; most other actions are not safe. 
+1

Puede hacer mucho más dentro de un manejador de señal. Sólo tienes que tener cuidado. Mire esto, por ejemplo: http://code.google.com/p/plcrashreporter/ – Roberto

Cuestiones relacionadas