システムコールやライブラリ関数

:Linuxでは、ファイルの操作には2つの方法がありますシステムコール(システムコール)とライブラリの呼び出し(ライブラリ関数)著書「APUE」での機能の大半はむしろライブラリ関数よりも、システムコールについて話しています。

1、システムコール

1.1コンセプト

  • コンピュータでは、システムコール(システムコール)が、また、あなたが実行するために、より高い権限を必要とオペレーティングシステムカーネルのサービス要求にユーザ空間プログラムで実行するシステムコール、として知られています。
  • システムコールは、ユーザプログラムとオペレーティングシステム間のインタフェースを提供します。(すなわち、システムは、ユーザプログラムはカーネルと対話するためのインタフェースであるコール)
  • システムコールは、我々は、オペレーティングシステムがハードウェアデバイスの機能に、オペレーティング・システム・インタフェースを提供するインタフェースの一連の操作(API)、をユーザに提供することを理解することができます。
  • オペレーティングシステムのサブ状態スーパーバイザモード(コアモード)噛合状態(ユーザ状態)
    ほとんどのシステムは、対話型操作がカーネルモードで実行求めます。例えば、装置間I / O動作またはプロセス通信。
    特別な指示:1のみがユーザーモードで実行していない特殊な命令をすることができ、異なるオペレーティングシステム間の特別な指示は、カーネルモードの違いで持っていますが、いくつかの一般的な手順およびハードウェアは、主に関連します。
    ユーザプログラムは、ユーザーモードでのみ実行することができ、システムは、しばしば、その後、システムを介したシステムコール・インタフェース・コールを使用し、コア機能にアクセスする必要があります。
    ユーザプログラムに安全にこれらの権限は非常に危険であればアプリケーションは時々 、いくつかの危険な、非常に特権命令を取ります。(例えば、プロセスは、それが正しく機能しなくさせる、別のプロセスのメモリ領域を修正することができる)、それは完全にこれらのアクセス許可を与えていないことはできません。だから、システムコールがあるだろう、命令が危険なシステムコールにパッケージ化され、ユーザーはそれらの命令の危険性があります自分自身を呼び出すことができないだけ。
    また、コンピュータのハードウェアリソースが限られている、より良いこれらのリソース、オペレーティングシステムによって、すべてのリソースの制御を管理するために、プロセスは、オペレーティングシステムにこれらのリソースのみを要求することができます。
    オペレーティングシステムは、このエントリは、システムコールで、これらのリソースへの唯一の入り口です。

ここに画像を挿入説明

1.2システムコールの例

例を与えることができ、我々は最も身近なハローワールドプログラムは、ライブラリ関数のprintfの出力情報は、このハードウェアデバイス画面に出力されますされプログラムの呼び出しのprintf()関数を、画面上の情報を出力しますです。我々は、すべてのハードウェアデバイスの動作用のドライバを必要とし、ドライバがオペレーティングシステムのカーネルで実装されている、ということを知っています。私たちのprintf()関数は、最終的には、システムコールの関数であるデバイスの画面を操作するためのLinuxカーネル相関関数を呼び出す必要がありますことを、この手段。実際には、printfの()ライブラリ関数の実現は、最終的にシステムコールの書き込み()を呼び出します。

加えて、プロセス作成フォーク()、のvfork()、
オープン、読み取り、sbrkの、フォークは、 システムコールです。

2、図書館

ライブラリ関数は、層のシステムコールのパッケージとして理解することができます。ユーザプログラムにカーネルによって提供されるシステムコールインタフェースは、その効率は、より効率的かつ合理ですが、時には我々は、情報へのアクセスを必要とする、より複雑な処理、またはより人間的なニーズである、我々はにパッケージ化、これらのプロセスを置きますプログラマと機能に供給され、プログラムが容易猿コーディング。次の例では、学習プロセスは、我々は(int型のfdが、charが* bufは読まない学びます 、int型のサイズ) システムコールは、この関数はフラグ(fdが)ファイルからのもので、大きさの文字を超えない読みますセクションと場所へ行くbufにデータが、このシステムでは、我々は唯一のNを呼び出すことができ、データが指定された読み取りのバイト、しかし、あなたが達成するために)(ライブラリ関数のfgetsを呼び出すことができますラインのために、このような需要を読みたい人、その内前述の「Cプライマープラス」ドキュメント/ IO、もちろん、すべての機能は、「Cプライマープラス」でライブラリ関数が言及されたされています。
例えば、典型的なCライブラリのprintf、fopenを、関数fread、malloc関数は

図3に示すように、両者の関係

ライブラリ関数は、おそらくシステムコールを含むようにしている、カーネル関数ライブラリ関数を伴うことなく、そのような(strlenをstrcpyの()、はstrstr()、として、システムコールを呼び出す必要はありませんため、)、などが挙げられる。これらの機能をいくつかのシステムコールを持つことが可能です。機能のために、時には私たちはどちらかあなたはまた、すべての人の実際のニーズに応じて選択することが、何の必須要件はありません実現するためのライブラリ関数を使用することができ、達成するためのシステムコールを使用することができます。例えば、ファイルの操作のために、私たちは、オープンを使用することができます()を達成するために、read()は、書き込み()、クローズ()システムコールは、もちろん、我々はまた、(fopenのを使用することができます)、関数fread()、fwriteの()、fgetsの()、 fcloseを()ライブラリ関数は、私たちはさまざまな状況のために最良の選択をするだけで、それぞれの特性を理解するために比較実現しています。

Library呼び出し システムコール
すべてのANSI Cコンパイラでは、Cライブラリ関数は同じです システムは、非ポータブルにプログラムを原因としている別の各オペレーティングシステムを呼び出し、
これは、プログラム(または関数)でライブラリを呼び出します これは、カーネル・サービスを呼び出します
ユーザプログラムに関連付けられています カーネルアドレス空間で実行
その実行時間は、「ユーザー時間」です これは、実行時「システム」の時間に属し、
プロシージャ・コール属し、呼び出しのオーバーヘッドは小さいです ユーザーコントロールとカーネルコンテキストスイッチの間に必要な、より大きなオーバーヘッド
Cライブラリlibc約300機能 UNIXでは、約90のシステムコールがあります
公開された17元の記事 ウォン称賛28 ビュー3846

おすすめ

転載: blog.csdn.net/weixin_46027505/article/details/104756929