如何将RUNTIME ERRORS重定向到STDERR?

我有一个使用PIPES与外部应用程序通信的C程序。

我使用EXECL:

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

现在我还使用DUP2将所有STDERR重定向到管道的写入端

 dup2(fd[1], STDERR_FILENO); 

如果我使用简单的Python脚本测试它,如:

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

我很乐意在“父母”中读回错误。

现在我的问题:假设我有一个C“子程序”,其中有内存泄漏或“无效指针”错误,如:

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

上面的REALLOC语句故意导致程序死亡,我将在运行时收到如下错误(显然PARENT不受影响,只有CHILD进程):

*检测到glibc ./error:realloc():指针无效:0xb77a5250 * *

还有一个完整的痕迹……

现在我如何才能将这样的运行时错误发送到STDERR,以便我可以将完整的跟踪读回到父级?

我是否必须将“运行时错误重定向到STDERR”? 当然可以捕捉孩子提出的这些繁忙错误,以便父母可以记录他们等等?

任何帮助或建议将不胜感激;-)

谢谢

林顿

默认情况下,Glibc将在进程的控制终端上生成输出(如果存在)。 听起来你想要设置环境变量LIBC_FATAL_STDERR_=1 ,它将总是向stderr发送致命错误。

如果您正在使用支持信号的系统(例如linux),那么一种可能的解决方案是使用信令机制。 我认为,安装无效内存引用的信号操作 (我相信这是SIGSEGV信号)应该抓住上面给出的特定示例。 在处理程序中,您可以根据需要将错误消息打印到STDERR。 但是,您仍然需要某种方法来确定堆栈跟踪。