¿Cómo redirigir ERRORES DE RUNTIME a STDERR?

Tengo un progtwig en C que usa PIPES para comunicarme con una aplicación externa.

Yo uso EXECL para esto:

execl("./errorprogram","./errorprogram", NULL); 

Ahora también he usado DUP2 para redirigir todos los STDERR al extremo de escritura de la tubería

 dup2(fd[1], STDERR_FILENO); 

Y si pruebo eso usando un simple script de Python como:

 data = sys.stdin.read() sys.stderr.write("Bad error\n") 

Felizmente puedo leer ese error en el “padre”.

Ahora, para mi problema: digamos que tengo un “progtwig secundario” en C que tiene una pérdida de memoria o un error de “puntero no válido” como:

 #include #include void main (){ char szInput[1024]; char *badvar; gets(szInput); badvar = realloc(badvar, 100); puts(szInput); fflush(NULL); } 

La statement REALLOC de arriba está intencionalmente para causar la muerte del progtwig, y ​​obtendré un error como el siguiente en tiempo de ejecución (obviamente, el PADRE no se ve afectado, solo el proceso de NIÑO):

* glibc detectó ./error: realloc (): puntero no válido: 0xb77a5250 * *

Y todo un rastro stace etc ….

Ahora, ¿cómo puedo obtener cualquier error de tiempo de ejecución como este para STDERR para que pueda leer el rastreo completo en el padre?

¿Tengo que redireccionar los “errores de tiempo de ejecución a STDERR”? ¿Seguramente es posible detectar estos agitados errores provocados por el niño para que los padres puedan registrarlos, etc.?

Cualquier ayuda o consejo sería muy apreciado 😉

Gracias

Lynton

Por defecto, Glibc producirá una salida en el terminal de control del proceso, si existe. Parece que desea establecer la variable de entorno LIBC_FATAL_STDERR_=1 , que en su lugar enviará errores fatales a stderr siempre.

Una posible solución si está trabajando en un sistema que admite señales , como Linux, es usar el mecanismo de señalización. La instalación de una acción de señal para las referencias de memoria no válidas (creo que esta es la señal SIGSEGV) debería, creo, captar el ejemplo particular que se proporciona arriba. En el controlador, puede imprimir mensajes de error a STDERR como desee. Sin embargo, todavía necesitaría alguna forma de determinar el seguimiento de la stack.