我正在使用一个似乎不存在exit()调用的嵌入式系统。
我有一个调用malloc的函数,而不是让程序在失败时崩溃我宁愿退出一点优雅。
我最初的想法是使用goto但是标签的范围似乎非常有限(我不确定,我从来没有使用过它们“从不使用GOTO !! 1 !!”)。
我想知道是否可以转到另一个函数的一部分,或者是否有任何其他创造性的方法从任意函数退出C程序。
void main() {
//stuff
a();
exit:
return;
}
void a() {
//stuff
//if malloc failed
goto exit;
}
感谢您的帮助。
答案 0 :(得分:9)
选项:
abort()
(警告:这不会调用atexit处理程序)。a()
指示错误的值,并通过错误传播,一直返回main
。setjmp/longjmp
。这些很难正确使用,但它们确实提供了你所要求的:从程序中的任何地方传输执行的能力(不一定包括信号/中断处理程序,但你可能不会调用malloc
无论如何)到main
函数中的特定点。答案 1 :(得分:3)
为什么不使用返回值
if malloc failed
return 1;
else
return 0;
...........
if(!a())
return;
答案 2 :(得分:2)
goto
不可能跳转到另一个函数。
通常情况下,建议您请不要使用goto!在这种情况下,您无法提出要求。
如何处理?解决方案很少。
检查有问题的功能的返回代码或值,并采取相应的行动。
使用setjmp
/ longjmp
。这个建议应该被认为比使用goto
本身更加邪恶,但它确实支持从一个函数跳转到另一个函数。
答案 3 :(得分:2)
嵌入式系统很少有exit()的变体,因为该函数在给定的上下文中不一定有意义。电梯或烤面包机的控制器从哪里出来?
在多任务嵌入式系统中,可能会有一个系统调用来退出或终止进程,只留下一个空闲进程,它只是一个繁忙的循环:while (1);
或者在某些情况下调用特权指令来上电保存模式:while (1) { asm("halt") };
在嵌入式系统中,从错误中“恢复”的一种可能方法是asm("trap #0");
或任何等效的调用中断向量,通过将内核转储到闪存驱动器或向UART输出错误代码来实现正常的系统关闭。