Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのシステムコールとライブラリ関数コールの違い

Linuxのシステムコールとライブラリ関数コールの違い

  
Linuxでは、ファイル操作に2つの方法があります。システムコールとライブラリ関数です。 "Linux Programming"(Neil MatthewとRichard Stonesによる英語のオリジナルの "Beginning Linux Programming")第3章:ファイルの取り扱いを参照することができます。システムコールは、実際には最低レベルのコールを指します。Linuxプログラミングでは、基になるコールの意味です。ハードウェア向けです。ライブラリ関数の呼び出しはアプリケーションの開発に向けられており、これはアプリケーションのAPIと同等ですが、これには多くの理由があります。第二に、移植性。 3番目に、根底にある呼び出し自体のパフォーマンス上の欠陥のいくつか。第四:apiもレベルと専門的な仕事指向を持ってみましょう。
ログイン1など、IOCTL、書き込み、読み取り、オープン近くに設けられ
システムコールシステムコール機能は、ヘッダファイルunistd.hを含める必要があります。例としてwriteを取ります。その関数プロトタイプはsize_t write(int fd、const void * buf、size_t nbytes)、その操作オブジェクトはファイルディスクリプタまたはファイルハンドルfd(ファイルディスクリプタ)です。書き込み権限openシステムコールでファイルを開き、開いているファイルのfdを取得します。たとえば、fd = open(\\" /dev /video \\" O_RDWR)です。 Fdは整数値で、新しいファイルを開くたびに、取得されるfdは現在の最大fdに1を加えたものです。 Linuxシステムはデフォルトで3つのファイル記述子値を割り当てます。0標準入力、1標準出力、2標準エラー。
システムコールは通常、ドライバ内のデバイスファイルへの直接アクセスなど、低レベルのファイルアクセスに使用されます。
システムコールはオペレーティングシステム
に関連しているため、通常、オペレーティングシステム間での移植性はありません。

システムコールはカーネル空間で行われるため、ユーザ空間の一般的なアプリケーションでファイル操作にシステムコールを使用すると、ユーザ空間からカーネル空間への切り替えのためのオーバーヘッドが発生します。実際、ファイルを操作するためにユーザ空間でライブラリ関数が使用されていても、ファイルは常に記憶媒体上に存在するので、ハードウェア(メモリ)の操作は、それが読み取り操作であれ書き込み操作であれ、必然的にシステムコールを引き起こす。つまり、ファイルに対するライブラリ関数の操作は、実際にはシステムコールを介して実装されます。たとえば、Cライブラリ関数fwrite()はwrite()システムコールによって実装されています。
この場合、ライブラリ関数を使用するとシステムコールのオーバーヘッドも発生しますが、システムコールを直接使用しないのはなぜですか。これは、ファイルの読み書きは通常大量のデータであるためです(これは基礎となるドライバのシステムコールに比べて大量のデータ操作です)。その場合、ライブラリ関数を使用することでシステムコール数を大幅に減らすことができます。この結果はバッファテクノロジによるものです。ユーザ空間およびカーネル空間では、ファイル操作にバッファが使用されます(たとえば、fwriteでファイルを書き込むと、最初にユーザ空間バッファに内容が書き込まれ、ユーザ空間バッファがいっぱいになるか書き込み操作が終了すると、ユーザはバッファリングされます)。領域の内容はカーネルバッファに書き込まれます同様の理由で、カーネルバッファの内容は、カーネルバッファがいっぱいになったとき、または書き込みが終了したときに、ファイルに対応するハードウェアメディアに書き込まれます。標準のCライブラリ関数は、fseek関数等FCLOSEファイル操作関数のfopen、関数fread、fwriteの、fflushは、のようにライブラリ関数を呼び出す

ログイン2、ヘッダファイルstdio.hのを含まなければなりません。関数プロトタイプはsize_t fwrite(const void * buffer、size_t size、size_t item_num、FILE * pf)で、操作オブジェクトはファイルポインタFILE * pfです。関数fopenを使用してファイルを開き、開いているファイルのFILE構造体ポインタpfを取得します。たとえば、pf = fopen(\\ "〜/proj /filename \\"、\\ "w \\")のようになります。実際、ファイルに対するライブラリ関数の動作は、システムコールによって最終的に実現されるので、各ファイルを開くことによって得られるFILE構造体ポインタは、それに対応するカーネル空間ファイル記述子fdを有する。対応する定義済みのFILEポインタもあります。標準入力、標準出力、標準エラーです。
ライブラリ関数呼び出しは通常、アプリケーション内の一般ファイルへのアクセスに使用されます。
ライブラリ関数呼び出しはシステムに依存しないため移植可能です。
ライブラリ関数の呼び出しはCライブラリに基づいているため、カーネル空間ドライバ内のデバイス上で操作することはできません。

※ライブラリは、すべてのANSI CコンパイラのバージョンでのVSシステムコールライブラリシステムコールを呼び出し、Cライブラリ関数は、同じシステムでは、各オペレーティングシステムは、それが呼び出す別のライブラリた呼び出しですプログラム(または機能)システムカーネルを呼び出すサービスはユーザプログラムに関連付けられており、オペレーティングシステムのエントリポイントはユーザアドレス空間で実行され、カーネルアドレス空間で実行されるランタイムは「ユーザ時間」に属し、その実行時間は「ユーザ時間」に属する。 「システム」時間は手続き呼び出しに属し、呼び出しのオーバーヘッドは小さく、ユーザー空間とカーネルコンテキストを切り替える必要があり、オーバーヘッドは大きいUNIXのC関数ライブラリlibcには約300個の関数があります。典型的なシステムコール90 Cライブラリコール:システム関数fprintfのmallocの典型的なシステムコール:CHDIRフォーク書込みBRK。
Copyright © Windowsの知識 All Rights Reserved