我有一个使用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”?当然可以捕捉孩子提出的这些繁忙错误,以便父母可以登录等等吗?
非常感谢任何帮助或建议; - )
谢谢
林顿
答案 0 :(得分:5)
默认情况下,Glibc将在进程的控制终端上生成输出(如果存在)。听起来你想要设置环境变量LIBC_FATAL_STDERR_=1
,而不是总是向stderr发送致命错误。
答案 1 :(得分:0)
如果您正在使用支持信号的系统(例如linux),那么一种可能的解决方案是使用信令机制。我认为,为无效的内存引用安装信号操作(我相信这是SIGSEGV信号)应该抓住上面给出的特定示例。在处理程序中,您可以根据需要将错误消息打印到STDERR。但是,您仍然需要某种方法来确定堆栈跟踪。