web-dev-qa-db-ja.com

Linuxのライブラリコールとシステムコールの違いは何ですか?

Linuxでのライブラリコールとシステムコールの違いは何ですか?両方の背後にある概念を十分に理解するための指針があれば、高く評価されます。

13
Sen

「ライブラリ呼び出し」というものは実際にはありません。共有ライブラリにリンクされている関数を呼び出すことができます。そしてそれは、呼び出す関数の場所を決定するために、実行時にライブラリパスが検索されることを意味します。

システムコールは、カーネルによって処理される低レベルのカーネルコールです。

9
Falmarri

シェルにman manと入力すると、マニュアルセクションのリストが表示されます

2システムコール(カーネルが提供する関数)

3ライブラリ呼び出し(プログラムライブラリ内の関数)

たとえば、man chmodと入力すると、マニュアルのセクション2にchmodが見つかります。そして、セクション3のfprintf

8
uloBasEI

システムコールはカーネルによって直接処理されます。

ライブラリ呼び出しは、動的(または静的にリンクされた)ライブラリによって処理されます。ライブラリ呼び出しを行うプログラムは、呼び出しが機能する前に、まずそのライブラリをインポートする必要があります。ライブラリ呼び出し自体はシステムコールを使用できます。

ライブラリは、システムコールの「フロントエンド」として提供され、カーネルでは提供されない追加の機能や使いやすさを提供する場合があります。

3
LawrenceC

基本的に、Linuxカーネルvizには2つのモードがあります。

  1. ユーザーモード、
  2. カーネルモード。

すべてのLinuxカーネルは、これらの2つのモード間で自身を切り替えます。通常、ライブラリ呼び出しは、ユーザーモードおよびシステムコールカーネルモードで実行されます。オペレーティングシステムの用語では、カーネルモードは本質的にAtomicであり、その監視モードですほとんどすべてのライブラリ呼び出しは、そのタスクを実行するためにカーネルからの助けを必要とします。次に、各ライブラリー呼び出しは、基礎となるシステム呼び出しを呼び出します。次の例を使用して、アイデアをより明確にしましょう

  1. fopen():ライブラリの呼び出しです。
  2. open():システムコールです。

Cプログラムでは、ヘッダーファイルからfopen()を使用します。プログラミング環境は、カーネルからシステムコールopen()を呼び出し、ファイルを開くタスクを実行します。実行後も、制御フローはユーザーモードに戻ります。

これを説明するには、次のタスクを実行します

  1. _man man_:ここには、1〜8のマニュアルセクションがあり、それぞれに特定の目的があります。
  2. _man fopen_を実行します。resposeはFOPEN(3)と表示されます。ここで3は、マニュアルページのマニュアルセクション3を示します。これは、cライブラリ呼び出しセクションです。
  3. _man open_を実行します。resposeはOPEN(2)として表示されます。ここで2は、システムコールセクションであるマニュアルページのマニュアルセクション2を示しています。

    コンセプトを理解していただければ幸いです。

1
alpha9eek

システムコール は、アプリケーションが使用するためにオペレーティングシステムが提供する関数です。一方、math.h、string.hなどの関数は、オペレーティングシステムとのインターフェイスとは何の関係もありません。

1
yasouser

ここで他の回答で言及されている違いに追加するだけです。

ライブラリ呼び出しは単なる関数呼び出しであるため、ユーザー空間からカーネル空間への切り替えは発生しません。一方、システムコールはカーネルモードで動作するため、システムコールはユーザー空間からカーネル空間に切り替わります。

1