¿El mensaje de "Fallo de segmentación" viene bajo STDERR?


17

Ejecuté un ejecutable en bash

./code > log

Muestra mensajes de error ocasionales en el terminal, mientras que todas las declaraciones printf van al archivo de registro. Lo vuelvo a ejecutar como a continuación

./code >& log

Ahora, los mensajes de error ocasionales también entran en el registro. Pero si hay una falla de segmentación, todavía se muestra en la terminal. ¿Por qué? ¿Cómo hacer que el mensaje Segmentation fault (core dumped)vaya al archivo de registro?


usuario $ bash --version

GNU bash, versión 4.2.24 (1) -release (i686-pc-linux-gnu)

Respuestas:


14

Una falla de segmentación es una señal, si no está captando esto, su programa finalizará y su shell lo imprimirá en su stderr (en lugar de en el stderr de su programa).

Es posible que su programa o el shell tomen acciones específicas cuando esto ocurre, ya sea por el programa captando la señal o su shell atrapando la señal SIGCHILD y luego verificando el estado de salida de su hijo.


1
@ user13107help trap
Carlos Campderrós

2
Sip. Entendido. si alguien está interesado, esto es lo que hice pastebin.com/QyeJYYHC
user13107

1
El trapcomando de shell atrapa las señales enviadas al shell . Por lo tanto, no funcionará detectar el que se envía a su programa.
derobert

1
@ warl0ck es posible detectar una falla por defecto de la misma manera que detecta cualquier señal, sin embargo, esto puede conducir a un comportamiento indefinido, pero si sabe lo que está haciendo, al menos puede morir de una manera sensata. El OP quería imprimir en stderr, en este caso, detectar el defecto y la impresión es segura.
cjh

1
@ warl0ck: puedes, es una muy mala idea hacer algo en el controlador, pero iniciar sesión y salir. Sin embargo, hay algunos casos de uso especializados.
Linuxios

19

El mensaje de "fallo de segmentación" se imprime en stderr, pero es el error estándar del shell, no el error estándar del programa. El shell imprime este mensaje cuando detecta que el programa ha finalizado debido a una señal.

Puede silenciar el mensaje redirigiendo stderr alrededor de la parte del script de shell que ejecuta el programa:

{ ./code; } >&log
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.