gpt4 book ai didi

c - 出现错误时安全退出到特定状态

转载 作者:行者123 更新时间:2023-12-05 01:25:13 24 4
gpt4 key购买 nike

在编写代码时,我经常检查是否发生错误。一个例子是:

char *x = malloc( some_bytes ); 
if( x == NULL ){
fprintf( stderr, "Malloc failed.\n" );
exit(EXIT_FAILURE);
}

我过去也使用过 strerror( errno )

我只写过小型桌面应用程序,在出现错误的情况下程序exit()ed 并不重要。

但是,现在我正在为嵌入式系统 (Arduino) 编写 C 代码,我不希望系统在出现错误时退出。我希望它进入一个特定的状态/功能,它可以关闭系统、发送错误报告和安全空闲。

我可以简单地调用一个 error_handler() 函数,但我可能处于堆栈深处并且内存非常低,导致 error_handler() 无法运行。

相反,我希望执行能够有效地折叠堆栈,释放大量内存并开始整理掉电和错误报告。如果系统不能安全关闭电源,则存在严重的火灾风险。

是否有在低内存嵌入式系统中实现安全错误处理的标准方法?

编辑 1:我将限制在嵌入式系统中使用 malloc()。在这种特殊情况下,如果文件格式不正确,则在读取文件时会发生错误。

最佳答案

也许你在等待圣洁setjmp/longjmp ,那个来拯救他们所有渴望内存的罪孽的人?

#include <setjmp.h>

jmp_buf jumpToMeOnAnError;
void someUpperFunctionOnTheStack() {
if(setjmp(jumpToMeOnAnError) != 0) {
// Error handling code goes here

// Return, abort(), while(1) {}, or whatever here...
}

// Do routinary stuff
}

void someLowerFunctionOnTheStack() {
if(theWorldIsOver)
longjmp(jumpToMeOnAnError, -1);
}

编辑:出于与您所说相同的原因,最好不要在嵌入式系统上执行malloc()/free()。简直拿不准。除非您使用大量 返回码/setjmp() 来释放堆栈中的所有内存...

关于c - 出现错误时安全退出到特定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com