Как перенаправить ошибки RUNTIME в STDERR?

У меня есть программа на C, которая использует PIPES для связи с внешним приложением.

Я использую EXECL для этого:

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

Теперь я также использовал DUP2 для перенаправления всех STDERR на конец записи канала

dup2(fd[1], STDERR_FILENO);

И если я проверю, что с помощью простого Python script вроде:

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

Я могу с радостью прочитать эту ошибку в "родительском".

Теперь для моей проблемы: скажем, у меня есть C "дочерняя программа", в которой есть утечка памяти или ошибка "неправильного указателя", например:

#include<stdio.h>
#include<string.h>

void main (){
    char szInput[1024];
     char *badvar;
    gets(szInput);

     badvar = realloc(badvar, 100);
    puts(szInput);
    fflush(NULL); 
}

Заявление REALLOC, приведенное выше, намеренно приводит к тому, что программа умирает, и во время выполнения я получаю ошибку, такую ​​как следующее: obvioulsy PARENT не влияет, только процесс CHILD):

* обнаружен glibc./error: realloc(): недопустимый указатель: 0xb77a5250 **

И целая трасса и т.д.

Теперь, как я могу получить любые ошибки времени выполнения, подобные этому, в STDERR, чтобы я мог прочитать полный трассу назад в родительский?

Нужно ли переадресовывать "ошибки времени выполнения в STDERR"? Несомненно, можно поймать эти суматошные ошибки, возникшие у ребенка, чтобы родитель мог их записывать и т.д.

Любая помощь или совет будет очень благодарна; -)

Спасибо

Линтон

Ответ 1

По умолчанию Glibc будет выдавать выходные данные на терминале управления процессом, если таковой существует. Похоже, вы хотите установить переменную окружения LIBC_FATAL_STDERR_=1, которая будет отправлять фатальные ошибки всегда в stderr.

Ответ 2

Одним из возможных решений, если вы работаете с системой, поддерживающей сигналы, например linux, является использование механизма сигнализации. Установка действия сигнала для недопустимых ссылок на память (я считаю, что это сигнал SIGSEGV) должен, я думаю, поймать конкретный пример, который вы указали выше. В обработчике вы можете распечатать сообщения об ошибках в STDERR по своему усмотрению. Тем не менее, вам все равно необходимо определить трассировку стека.