Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux環境のプログラミング - perror、exit、

Linux環境のプログラミング - perror、exit、

  

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

定義関数

void perror(const char) * s); perror(" open_port");

関数説明

perror()は、前の関数のエラーを標準エラー(stderr)に出力するために使用されます。 Br>。パラメータsが指す文字列が最初に表示され、その後にエラー理由文字列が続きます。このエラーの原因は、グローバル変数errorの値に従って出力される文字列です。ライブラリ関数にはエラー変数があり、各エラー値は文字列で表されるエラーの種類に対応します。 「some」関数エラーを呼び出すと、関数はerrorの値をリセットしました。 perror関数は単に現在のエラーに対応するエラーとともにあなたが入力した情報の一部を出力します。 Exit:(#include< stdlib.h>)Cのメイン関数では通常return(0)を使います;このようにして値を返します。しかし、これは無効な状況、つまり無効なmain()に限定されます。 Exit()は通常、プログラムを終了させるためにサブルーチンで使用されます使用後、プログラムは自動的に終了し OS
から飛び出します。 Exit(0)はプログラムが正常に終了することを意味し、exit(1)/exit(-1)はプログラムが異常終了することを意味します。 Exit()プログラム全体のうち、現在のプロセス/現在のプログラム/を終了します。exitが呼び出されている間は終了します。しかし、mainがvoidとして定義されているかどうかにかかわらず、mainでexitを使用する場合、返される値は有効であり、exitは型を考慮する必要がないので、exit(1)はreturn(1)と同じです。例えば、#include< stdlib.h> int main(){exit(1); //return(1)と同等です;} exit()は、プロセスが使用していたメモリ空間を削除するプロセスを終了させる関数です。同時に、エラーメッセージが親プロセスに返され、waitシステムコールは親プロセスで戻りメッセージを受け取ります。

プロセスは人間の生活に似ていますが、fork()関数を使用してプロセスを作成した後、そのプロセスをどのように停止しますか?

プロセスの終了

1. Linuxのプロセスの終了を許可します。

プロセスが終了し、プロセスが終了しようとしていることを示します。 Linuxでは、プロセス終了は正常終了と異常終了に分けられます。

1>正常終了

a。main()関数でreturnを実行します。


b。exit()関数を呼び出します#include< stdlib.h> void exit(int status)

c.call _exit()関数を呼び出します#include<; unistd.h> void _exit(int status)

statusは、プロセス終了時に状態を渡すために使用できる整数パラメータです。一般に、0は正常終了を意味し、それ以外の値はエラーを示し、プロセスは異常終了します。実際のプログラミングでは、waitシステムコールを使用して子プロセスの戻り値を受け取ることができるので、状況に応じて異なる処理を行うことができます。

2>例外出口

a。about関数を呼び出します。

b。プロセスは、プログラムを終了させるシグナルを受け取ります。

Tiger-John説明:終了方法に関係なく、システムは最終的にカーネル内で同じコードを実行します。このコードは、プロセスによって使用されている開いているファイル記述子を閉じるために使用され、メモリおよびそれが占有している他のリソースを解放します。



3>上記のexitメソッドの違いを比較します。

(1)exitとreturnの違い:

A.exitはパラメータを持つ関数です。 exitが実行された後、システムに制御が渡されます。

b.returnは、関数が実行された後の戻り値です。貸し出しが実行された後、制御は呼び出し機能に渡されます。

(2)終了と中止の違い:

a.exitは正常終了プロセスです。

b.aboutは異常終了です。



今度はexit()と_exit()関数に焦点を絞ります。


2.exit()と_ exit()学習

1> exitおよび_exit関数はプロセスを終了するために使用されます。

終了または_exitするためにプログラムが実行されると、システムは無条件にすべての操作を停止し、PCBを含むさまざまなデータ構造を消去して、このプロセスの操作を終了します。

2> exitがヘッダーファイルstdlib.hで宣言され、_exit()宣言がヘッダーファイルunistd.hで宣言されています。 exitのパラメータexit_codeは0で、プロセスが正常に終了したことを示し、それ以外の場合はプログラムの実行中にエラーが発生したことを示します。

3> exit()と_exit()の違い:

a._exit()は実行直後にカーネルに戻り、exit()はまずクリーンアップを実行します。制御はカーネルに与えられます。

b。_exit関数が呼び出されると、プロセスのすべてのファイル記述子を閉じ、メモリや他のカーネルのクリーンアップ関数をクリーンアップしますが、ストリームをリフレッシュしません(stdin、stdout、stderr ...)。関数は、_exitを呼び出し、呼び出す前にストリームをフラッシュする_exit関数のラッパーです。

Tiger-John説明:

exit()関数と_exit()関数の最大の違いは、exit()関数がファイルをバッファリングする前に、exitシステムを呼び出す前に開いているファイルをチェックすることです。領域の内容はファイルに書き戻されます。 Linuxの標準ライブラリのために、 "バッファI /O"と呼ばれる操作があります。これは、開いているファイルごとにメモリ内のバッファを特徴とします。ファイルが読み取られるたびに、いくつかのレコードが連続して読み取られるので、次にファイルが読み取られるときには、メモリーのバッファーから直接読み取ることができ、同様に、ファイルが書き込まれるたびにメモリーに書き込まれるのはバッファーだけになります。特定の条件(特定の数に達する、特定の文字に遭遇するなど)を待ってから、バッファーの内容を一度にファイルに書き込みます。この手法はファイルの読み書き速度を大幅に向上させますが、プログラミングに多少の問題も生じます。たとえば、データがある場合はファイルが書き込まれたと考えられ、実際には特定の条件が満たされていないため、バッファに格納されるだけで、_exit()関数によってプロセスが直接閉じられ、バッファのデータは失われます。 。したがって、データの整合性を確保するためには、exit()関数を使用する必要があります。

c。関数インスタンスごとに違いを見てみましょう:

関数インスタンス1:exit.c

1#include< stdio.h> 2# < stdlib.h> 3 4 int main()5 {6 printf( "using exit ---- \\ n"); 7 printf( "これはバッファの内容です。\\ n"); 8 exit(0)

関数がデバッグされました

$ gcc exit.c -o exit $ ./exit

実行結果は次のとおりです。

using exit ----これはバッファの内容です。

関数インスタンス2:_exit.c

1#include< stdio.h> 2#include< unistd.h> 3 4 int main( 5 {6 printf(“ using _exitを使用 - \\ n”); 7 printf(“これはバッファの内容です”); 8 _exit(0); 9}関数がデバッグされた後

$ gcc _exit.c -o _exit $ ./_exit

実行結果は次のとおりです。

using _exit--

Tiger-John説明:

1 .printf関数は、バッファリングされたI /Oを使用する方法です。バッファリングされたI /Oは、改行文字に遭遇すると自動的にバッファからレコードを読み取ります。そのため、exit()はバッファデータが書き込まれた後に終了し、_exit()関数は直接終了します。

2.関数インスタンス2のprintf("これはバッファの内容です);をprintf("これはバッファの内容です\\ n")(すなわちprintfの中)に変更することもできます。最後に、実行結果が何であるかを確認するために\\ nを追加します。これはなぜなのでしょうか。これはゾンビプロセスと呼ばれるデータ構造です。ゾンビプロセスは非常に特別なプロセスで、ほとんどすべてのメモリスペースを放棄し、実行可能コードを持たず、スケジュールすることもできず、プロセスリスト内の位置を保持し、プロセスの終了ステータスなどの情報を記録します。集めて、さらに、ゾンビプロセスはもはやメモリスペースを占有しません。

wait wait関数は、子プロセスが終了するかプロセスが指定されたシグナルを受け取るまで、親プロセス(つまり、waitを呼び出したプロセス)をブロックするために使用されます。親プロセスに子プロセスがない場合、またはその子プロセスが終了した場合は、waitはすぐに戻ります。 #include< sys /types.h> #include< sys /wait.h> pid_t wait(int * status)waitpid waitpidはwaitと同じ働きをしますが、最初に終了した子プロセスを待つ必要はありません。それはまた、待ち機能のノンブロッキングバージョンの提供やジョブ制御など、いくつかのオプションがあります。実際、wait関数はwaitpid関数の単なる特殊なケースで、waitpid関数はLinux内に実装されたときに直接呼び出されます。 #include< sys /types.h> #include< sys /wait.h> pid_t waitpid(pid_t pid、int * status、int options)
zh-CN"],null,[1],zh-TW"]]]

Copyright © Windowsの知識 All Rights Reserved