2010-05-19 17 views

Respuesta

22

Los c99 norma indica que assert llamadas abort y los abort estados cosas lo siguiente acerca del código de retorno:

Una forma definida por la implementación del estado de terminación sin éxito se devuelve al entorno de acogida a través de la función aumento de llamadas (SIGABRT).

Está documentado en la sección 7.2.1.1 (afirmar) y 7.20.4.1 (abortar) de la norma c99 here.

Muchos sistemas UNIX devolverán 128 más el número de señal (SIGABRT es la señal número 6) por lo que puede obtener 134. Lo que obtenga, debe documentarse mediante la implementación C.

Por ejemplo, ver here para gcc. Aunque no dice nada sobre lo que se devuelve al entorno de llamadas. De las secciones específicas here:

La biblioteca y el sistema operativo (u otro entorno cuando se compila para un entorno autónomo) seleccionan algunas opciones; consulte su documentación para más detalles.

Y here:

El comportamiento de la mayoría de estos puntos dependen de la implementación de la librería C, y no se definen por sí mismo GCC.

Así es el glibc doco here en la terminación del programa (específicamente el bit de estado de salida). Menciona convenciones pero no reglas firmes.

+0

Esta es una respuesta fantástica, y 134 es exactamente lo que obtengo. –

+0

Parece que el enlace a la documentación de GCC no contiene nada de interés, ni puedo encontrar la cotización que ha realizado. –

+0

¿Podría cambiar el enlace glibc doco para señalar directamente aquí a menos que me haya perdido algo? http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status –

2

Es específico de la implementación. Usted puede hacer esto:

int main() 
{ 
    assert(0); 
} 

luego ejecutarlo:

> ./a.out 
> echo $? 
1 (<- or whatever) 

Esto, al menos, te dirá qué esperar para su configuración. Estoy obteniendo 134 en un par de cajas linux con gcc y g ++.

+3

Siempre debe respaldar sus respuestas con una referencia específica al estándar. – wilhelmtell

+1

Los compiladores no siempre siguen el estándar de la T. (Estoy mirando a Microsoft) Si bien es bueno saber lo que dice la norma, también es igual de bueno saber lo que realmente hacen los compiladores. Lo que deberían hacer no es siempre lo que realmente hacen. Eso y el estándar no es realmente gratis. –

-1

Estaba trabajando con colas de mensajes posix Tengo el mismo error mq_open falló con errono 38 (ENOSYS).

El trabajo consiste en reconstruir el kenel con POSIX MESSGE QUEUE habilitado en la configuración del kernel.

Esto construirá el núcleo con soporte de cola de mensajes POSIX y ha funcionado para mí.

Gracias

+1

Creo que quisiste poner esta respuesta en otra pregunta. –

0

No puedo encontrar la especificación real de ella (POSIX es un poco difícil de búsqueda), pero he encontrado una referencia.

Una aserción arrojada da como resultado un estado de salida que es igual a lo que EXIT_FAILURE se expande para ser (reference).Dado que se trata de Linux, también se trata de POSIX, que define aún más el comportamiento de c99.

Cuestiones relacionadas