5

我正在使用一个嵌入式系统,其中 exit() 调用似乎不存在。

我有一个调用 malloc 的函数,而不是让程序在失败时崩溃,我宁愿更优雅地退出。

我最初的想法是使用 goto,但是标签的范围似乎非常有限(我不确定,在“永远不要使用 GOTO !!1 !!”之前我从未使用过它们)。

我想知道是否可以转到另一个函数的一部分,或者是否有任何其他创造性的方法可以从任意函数退出 C 程序。

void main() {
  //stuff
  a();

  exit:
     return;
}

void a() {
   //stuff

   //if malloc failed
   goto exit;
}

谢谢你的帮助。

4

4 回答 4

9

选项:

  • 由于您的系统是非标准的(或者可能是标准但非托管的),请查看其文档以了解如何退出。
  • 尝试abort()(警告:这不会调用 atexit 处理程序)。
  • 检查您的系统是否允许您向自己发送会杀死自己的信号。
  • a()指示错误返回一个值,并通过错误返回一直传播到main.
  • 检查你的系统是否有setjmp/longjmp. 这些很难正确使用,但它们确实提供了您所要求的:从程序中的任何位置转移执行的能力(不一定包括信号/中断处理程序,但无论如何您可能不会调用malloc其中任何一个)到您main功能中的特定点。
  • 如果您的嵌入式系统是这样的,您的程序是在其上运行的唯一代码,那么您可以调用一些进入错误状态的代码而不是退出:可能是一个无限循环,可能会闪烁 LED 或以其他方式表明错误已发生了。也许你可以引发重新启动。
于 2012-12-03T09:28:37.757 回答
3

为什么不使用返回值

if malloc failed
  return 1;
else 
  return 0;


...........

if(!a())
   return;
于 2012-12-03T09:24:48.647 回答
2

goto不可能跳转到另一个函数。

通常,建议您不要使用 goto!在这种情况下,您的要求是不可能的。

如何处理?解决方案很少。

  • 检查有问题的函数的返回码或值并采取相应措施。

  • 使用setjmp/ longjmp。这个建议应该被认为比使用它自己更邪恶goto,但它确实支持从一个函数跳转到另一个函数。

于 2012-12-03T09:32:40.730 回答
2

嵌入式系统很少有 exit() 的任何变体,因为该函数在给定的上下文中不一定有意义。电梯或烤面包机的控制器出口到哪里?

在多任务嵌入式系统中,可能会有一个系统调用来退出或终止一个进程,只留下一个空闲进程,它只是一个忙循环:while (1);或者在某些情况下调用特权指令进入节能模式:while (1) { asm("halt") };

在嵌入式系统中,从错误中“恢复”的一种可能方法是asm("trap #0");调用中断向量或任何等效方法,该方法通过将内核转储到闪存驱动器或向 UART 输出错误代码来实现系统正常关闭。

于 2012-12-03T09:43:13.817 回答