5

exit() 呼び出しが存在しないように見える組み込みシステムを使用しています。

malloc を呼び出す関数があり、失敗したときにプログラムをクラッシュさせるのではなく、もう少し優雅に終了したいと思います。

私の最初のアイデアは goto を使用することでしたが、ラベルの範囲は非常に限られているようです (よくわかりませんが、「NEVER USE 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/longjmpmallocこれらは正しく使用するのが難しいですが、あなたが求めていたものを提供します: プログラムのどこからでも実行を転送する機能 (必ずしもシグナル/割り込みハンドラーを含む必要はありませんが、とにかくそれらのいずれかを呼び出すことはないでしょう)関数の特定のポイントに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") };

組み込みシステムでエラーから「回復」する方法の 1 つはasm("trap #0");、割り込みベクトルを呼び出すこと、またはそれと同等の方法で、コアをフラッシュ ドライブにダンプするか、エラー コードを UART に出力して、正常なシステム シャットダウンを実装することです。

于 2012-12-03T09:43:13.817 に答える