web-dev-qa-db-ja.com

Cでプログラムをすぐに閉じるにはどうすればよいですか?

私はいくつかのデータを分析しているCコードを書いています。 100個のデータ入力のみを処理するようにプログラムを設定しました。入力が100を超える場合、セグメンテーションエラーが発生しています。入力数が100を超えるとユーザーに警告が表示され、プログラムが終了するように方法を作成します。 return 0だけでメイン関数からそれを行う方法を知っていますが、メインから離れた複数の関数呼び出しであり、この関数のreturn 0でもループを維持することは困難です。

メインにならずにプログラム全体を終了する方法はありますか?

22
Syntax_Error

標準関数exitは、あなたが探しているものです:

プロセスを正常に終了し、プロセスを終了するための定期的なクリーンアップを実行します。

まず、atexitの呼び出しによって登録されたすべての関数は、登録の逆の順序で実行されます。次に、すべてのストリームが閉じられ、一時ファイルが削除され、最終的に制御がホスト環境に戻ります。

ステータス引数がホスト環境に返されます。

ただし、segfaultエラーを修正した方が良いでしょう。

38
K-ballo

標準のlibを含める必要があり、必要に応じてexitを呼び出すことができます。

#include <stdlib.h>
...
exit(status);

ここで、statusは終了コードを表す整数です。関係のステータス:慣習0では成功、他の値はエラーステータスを示します。

6
Heisenbug

fprintf(stderr, ....)を呼び出してからabort();を呼び出すこともできます。これは、後でバグをデバッグする場合に役立ちます。

しかし、サイズ制限が利用可能なリソースによってのみ与えられるように、プログラムを再コーディングする必要があると思います:したがって、プログラムを多くのbiggerコンピューター(それが何であれ)で実行すると、100以上の入力を処理できます。

やや良いことは、シグナルハンドラーでセグメンテーションエラーをキャッチし、シグナルハンドラーにSIGSTOPシグナルを発生させることです。

そのようにして、プログラムは停止しますが、メモリに残ります。その後、デバッガーでアタッチして、SEGFAULTが発生した時点でプログラムがすべて凍結されているのを確認できます。

これは、開発IDE内で実行していない長時間実行プログラムの問題を見つけるのに役立ちます。

1
bazza