2013-04-20 72 views
4

发生错误时,我希望我的C代码在退出程序之前存储错误。建议将stderr存储到文件(例如/home/logs.txt),还是建议使用其他方法保存日志/错误报告(考虑编程环境为Linux)。例如,下面的代码,我怎么能适用于/home/log.txt/home/log在C编程中存储日志/错误消息

FILE *fp1; 
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){ 
    fprintf(stderr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno)); 
    close(fp1); 
    exit(1); 
} 

谢谢存储日志/错误消息的方法。

+1

对'close()'的调用是错误的,因为它是为文件描述符而不是文件句柄。当你传递一个指向预期整数的指针时,你应该在这里感受到编译器的警告/错误。然而调用'fclose()'将会是多余的,因为文件没有被打开,这是由'fp1'表示'NULL'。 – alk 2013-04-20 08:59:30

+0

谢谢alk,我会修复它在我的代码 – sven 2013-04-20 13:01:56

回答

3

如果stderr始终用于打印出您的所有错误信息,那么您可以将输出重定向到特定文件。

$ program 2>~/logs.txt 

为了更好的记录工具,你可以使用:

+0

'syslog'不是系统调用(它不在man文件的第2部分),而是一个标准库函数。我建议使用它。 – 2013-04-20 06:29:28

0

如果要存储错误,stderr可能不是一个好选择,因为每次运行程序时都需要将stderr管道传输到文件。

如果要写入/home/log.txt,请打开FILE指针并使用fprintf写入,尝试打开/ sys/class/gpio/export并写入该文件,而不是stderr。另外一定要用追加模式打开日志文件。

FILE *fp1; 
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){ 
    FILE *fpErr = fopen("/home/log.txt", "a"); 
    if(fpErr != NULL) 
     fprintf(fpErr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno)); 
    close(fpErr); 
    close(fp1); 
    exit(1); 
}