Comment redirect les erreurs d’exécution vers STDERR?

J’ai un programme C qui utilise PIPES pour communiquer avec une application externe.

J’utilise EXECL pour cela:

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

Maintenant, j’ai aussi utilisé DUP2 pour redirect tous les STDERR vers le bout d’écriture

 dup2(fd[1], STDERR_FILENO); 

Et si je teste cela en utilisant un simple script Python comme:

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

Je peux heureusement lire cette erreur dans le “parent”.

Maintenant pour mon problème: Disons que j’ai un “programme enfant” en C qui contient une fuite de mémoire ou une erreur de type “pointeur invalide” comme:

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

L’instruction REALLOC ci-dessus est délibérément là pour provoquer la mort du programme, et j’obtiendrai une erreur comme celle-ci au moment de l’exécution (évidemment, le PARENT n’est pas affecté, seul le processus ENFANT):

* glibc détectée ./error: realloc (): pointeur invalide: 0xb77a5250 * *

Et toute une trace de trace etc …

Maintenant, comment puis-je obtenir des erreurs d’exécution de ce type dans STDERR afin de pouvoir lire la trace complète dans le parent?

Dois-je redirect les “erreurs d’exécution vers STDERR”? Il est sûrement possible d’attraper ces erreurs trépidantes générées par l’enfant afin que le parent puisse les consigner, etc.

Toute aide ou conseil serait grandement apprécié 😉

Merci

Lynton

Par défaut, Glibc produira une sortie sur le terminal de contrôle du processus, s’il en existe un. Il semble que vous souhaitiez définir la variable d’environnement LIBC_FATAL_STDERR_=1 , qui enverra toujours les erreurs fatales à stderr.

Une solution possible si vous travaillez sur un système prenant en charge les signaux , tel que Linux, consiste à utiliser le mécanisme de signalisation. L’installation d’une action de signal pour les références de mémoire non valides (je crois que c’est le signal SIGSEGV) devrait, je pense, comprendre l’exemple que vous avez donné ci-dessus. Dans le gestionnaire, vous pouvez ensuite imprimer les messages d’erreur dans STDERR à votre guise. Cependant, vous aurez toujours besoin d’un moyen de déterminer la trace de la stack.