如何将RUNTIME错误重定向到STDERR?

时间:2010-11-27 05:50:38

标签: c

我有一个使用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<stdio.h>
#include<string.h>

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”?当然可以捕捉孩子提出的这些繁忙错误,以便父母可以登录等等吗?

非常感谢任何帮助或建议; - )

谢谢

林顿

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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