終了()、_終了()、およびリターン

C言語の復帰、終了、中断、継続。ステータスコードは通常、同時に最初の二つの機能を持ってプログラムを終了を使用し、標準Cは/usr/include/stdlib.hに位置EXIT_SUCCESS EXIT_FAILURE二つのマクロを持っています。
これは、定義されます
。の#define EXIT_FAILURE 1
EXIT_SUCCESSのに#defineは0

exit関数の_exit()アクションとの機能差。

定義は、ライブラリファイルショーがありますエラーが発生した後、プログラムを終了し、ライブラリ関数である出口(1)出口を表し、出口(0)が正常終了を示しています。
終了STDLIB.H機能では、次のように定義されています:void終了(INTステータス);
このシステムコールは、プロセスを終了するために使用され、プログラムの中で、限りの出口の実装として、プロセスは、プロセスから終了するに関係なく実行します。
退出システムコールの話、我々は別のシステムコールを言及する必要があり、_exit、_exit()関数はunistd.hに位置しており、終了()、_終了()関数に比べて、実行中のプロセスの中で最も単純で直接的終了の関数であり、プロセスが終了する前に、ファイルの状態を確認するために、ファイルの内容バッファファイルを書き込むことを解放しますメモリは、使用するスペースとデータ構造の破壊メモリ内、および終了()。
私たちは、この操作により、printfの上記バッファ機能に結合する場合について説明下:

プロセスを終了するには終了します。

#include <stdlib.h>
#include <stdio.h>

main()
{
printf("output begin\n");
exit(0);
printf("output end\n");
}

実行はgcc -o EXIT1 exit1.c EXIT1生成し、実行出力のみが始まるプリントアウトされます。

終了は、バッファファイルの書き込みされます。

メモリ内の各開いているファイルに対応するが、バッファを有し、ファイルが読み込まれるたびに、リードは、それぞれ、ファイルを読み込むとき、次のメモリバッファから直接読み取ることができるように、レコードの数よりなりそれが唯一のライトバッファメモリであり、そのため、バッファ(、)のn \な改行として、この特定の文字を(経験とEOF EOFされている一定量まで)一定の条件を満たすために、ファイルを書き込みます追記型のファイルの内容は、私たちがいることを知っている
のボイド終了(INTステータス);
出口()は現在のプロセスの正常終了を実行するために、親プロセスへのパラメータの状態に戻り、そしてプロセスは、すべてのデータがバッファライトバックに自動的にされ、閉じられていないファイルを閉じます。

#include <stdlib.h>
#include <stdio.h>

main()
{
printf("output begin\n");
printf("content in buffer");
exit(0);
}

(GCC)
$ ./exit1
output begin
content in buffer
のprintf()フォーマットは、パラメータ及びフォーマットのデータ列に応じて変換することができ、その後、アップ文字列が表示され(「\ 0」)が終了するまで、標準出力デバイスに結果を書き込みます。目に見える、改行文が記された出力ファイルを保存するためには表示されません終了します。

_exit()はクリーンアップI / Oバッファ動作を行いません。

_exit()は現在のプロセスへの即時終了を実行するために使用され、親プロセスへのパラメータの状態に戻り、と閉じていないファイルを閉じています。この関数呼び出しが戻ると、親プロセスにSIGCHLDシグナルを渡されていませんした後、親プロセスは機能待ち状態の子プロセスの終了によって達成することができます。

#include <stdio.h>
#include <unistd.h>

main()
{
printf("output begin\n");
printf("content in buffer\n");
_exit(0);
}

(GCC)は
$ ./exit2
output begin
、一定の条件が満たされていないので、彼らはただバッファに保存され、その後、我々は_exit()関数を使用し、直接シャットダウンを処理し、バッファ内のデータが失われます実際に二printf文であります

比較して終了は、break文は、サイクル、ほとんどの場合に使用され、引き続き、関数の戻り値を提供するために、主に戻ります。多くの友人は、3つの文と終了を混乱させる可能性があり、これらの3つのステートメントの面積は言うことができませんでした。

exit関数の戻り値のコマンドの違い:

  • 比喩的に言えば、A市からのリターンは、A市から直接、セルへの出口をyのセルをxは

  • プログラムが実行されているプログラムの終わりのための任意の時点で出口は、パラメータはOSの出口に返されます。また、暗黙のうちに、main関数の最後にexit関数を呼び出します。最初のatexit()関数によってexit関数のランタイム関数を実行します登録され、その後、独自のクリーンアップ作業の一部を行うには、すべての出力ストリームを更新し、近くに開いているすべてのフローおよび標準I / O機能TMPFILE(で閉じます)一時的に作成し、ファイル。出口は、処理を終了する親プロセスはエラーメッセージを返すが、それは、プロセスによって使用されるメモリ空間を除去します。

    • 出口が256未満の任意の整数を返すことができます。(別のプロセスは、オペレーティングシステムに返されます。それはマルチプロセスである場合は、親プロセスに返されます。親の呼び出しはwaitpidのプロセス()および他の機能を子プロセスの終了を取得するために、主に異なる処理のための呼び出し側に異なる値を返します。状態は、発信者が適切な処置を行うことができるように、対応する戻り値に応じて異なる方法で処理される。全体的に、出口()戻り括弧内に、プログラムの呼び出し元のプログラムに制御を現在のプロセスは、戻り値です、呼び出し側がプログラムを実行する様子を語りました。)
    • 出口(1)プロセスが終了は、通常、1を返すことを示します;
    • 出口非正常終了のプロセスは0を返すこと(0)を意味します。
  • パラメータのatexit()関数は、関数ポインタ、引数なしの関数への関数ポインタであり、値を返しません。atexit()関数のプロトタイプ:INTのatexit(ボイド(*)(ボイド));缶のatexit()32の処理これらの処理機能の逆の順序のシーケンスで呼び出されるプログラムで機能し、その登録、即ちまで登録最終コールの最初の登録、最終登録の最初の呼び出し

  • リターンは、リターンコールスタックを表す言語レベル、であり、出口のシステムコールレベルは、それがプロセスの終了を表します。メインリターンに呼び出すものであること、ない場合は当然、現在のプロセスを終了し、メイン機能である場合はリターン()関数の戻り電流は、もちろん、です。時には場合は、処理が正常に終了するかどうかを検知する。複数のプロセスが値を返すとき、私たちは最後のプロセスを使用する必要があります。

  • 関数が値を返すには、関数の戻り値のステートメントは、全体の関数の戻り値を提供し、それを呼ばれる場所に、現在の関数の戻りを終了することです。また、このようなエラーが現在の関数とリターンの最後の実装を進めるためにチェックするときのように、値を返さない関数内のreturn文を使用することができます。メインの最後に、一般的なプログラムの実行()を使用すると、プログラムの最後に何かをしたい場合は、この機能を使用しようとすることができ、完了です。
    例:

#include <stdio.h>
void test1(void)
{
	printf("exit test1\n");
}

void test2(void)
{
	printf("exit test2\n");
}

int main()
{
	atexit(test1);
	atexit(test2);
	printf("exit main\n");
	return 0;
}

プロセス環境及びプロセス制御(1):プロセスの起動と終了

  1. プロセスが開始されます:

Cプログラムは、メイン関数のプロトタイプから開始され、次のとおりです。

INTメイン(int型ARGC、CHAR * ARGV [])。

戻り値が正しく0を返し、通常はメインint型です。

メインボイドやノーの戻り値の場合は、いくつかのコンパイラは、メインの戻り値は、通常0で警告を与えるだろう。

メインコマンドラインパラメータは、以下のプログラムを示し、この中で、説明するのはあまりをしません。

以下は、コード断片です。

  #include <stdio.h>
  int main(int argc, char *argv[]) 
  { 
  int i; 
  for (i = 0; i < argc; i++) 
  printf("argv[%d]: %s\n", i, argv[i]); 
  return 0; 
  }

2.プロセスが終了します:

正常終了、異常終了:C終端は、二つのプログラムに分かれ。

リターンは、exit、_exit、_Exit、pthreade_exit:通常に分かれて終了

スレッド応答をキャンセル、中断、SIGNAL:異常中指が分かれています

主に正しく終了最初の4つ、すなわち退出シリーズの機能について話しています。

以下は、コード断片である:
の#include
  ;無効終了(INTステータス)
  のボイド_Exit(int型のステータス);
  の#include
  無効_exit(int型のステータス)。

上記3つの機能の違いは以下のとおりです。

終了()(または0を返す)私は終了基準ハンドラが呼び出されます、およびユーザースペース/ Oスカベンジャー(例えばfcloseを)、_exit _Exitと直接明確に引き継がれたカーネルを呼び出すことはありません。

管理。

このように、メイン機能で出口(0)は0を返すことと等価です。

3. atexitを終了ハンドラ:

ISO Cは、シーケンスによって呼び出され、これらの機能が自動的に逆の出口によって登録終了処理32の大部分が機能を登録することができる方法を提供する。同じ機能を繰り返し登録した場合、あろう

複数回呼び出されます。

次のようにプロトタイプは次のようになります。

#含める

int型のatexit(無効(* FUNC)(無効));

パラメータは、関数ポインタ終了関数であり、関数は、基準値を返しません。

一例として、次のプログラムで:

以下は、コード断片です。

 #include <stdio.h>
  static void myexit1() 
  { 
  printf("first exit handler\n"); 
  } 
  static void myexit2() 
  { 
  printf("second exit handler\n"); 
  } 
  int main() 
  { 
  if (atexit(my_exit2) != 0) 
  printf("can't register my_exit2\n"); 
  if (atexit(my_exit1) != 0) 
  printf("can't register my_exit1\n"); 
  if (atexit(my_exit1) != 0) 
  printf("can't register my_exit1\n"); 
  printf("main is done\n"); 
  return 0; 
  }

業績:(GCC)
$./ a.out
main is done
first exit handler
first exit handler
second exit handler

リリース9件のオリジナルの記事 ウォンの賞賛4 ビュー654

おすすめ

転載: blog.csdn.net/weixin_45494811/article/details/104042126