24

マンページには複数のセクションがあります。それらの2つは次のとおりです。

2 つの Unix および C システム コール
3 C プログラム用の C ライブラリルーチン

たとえばと がgetmntinfo(3)ありgetfsstat(2)、どちらも同じことをしているように見えます。どちらをいつ使用する必要があり、違いは何ですか?

4

5 に答える 5

30

システム コールはオペレーティング システムの関数であり、UNIX の場合と同様に、malloc()関数はシステム コールの上に構築されsbrk()ます (プロセスのメモリ空間のサイズを変更するため)。

ライブラリは、オペレーティング システムの一部ではない単なるアプリケーション コードであり、多くの場合、複数の OS で使用できます。それらは基本的に、独自のプログラム内の関数呼び出しと同じです。

線は少しぼやけているかもしれませんが、システム コールをカーネル レベルの機能と見なすだけです。

于 2009-02-21T13:08:07.517 に答える
13

一般的な関数のライブラリはシステム コール インターフェイスの上に構築されますが、アプリケーションは両方を自由に使用できます。

システム コールは、カーネル リソースを使用するためのアクセス権を持つ認証キーのようなものです。

ここに画像の説明を入力

上の画像は高度な Linux プログラミングからのもので、ユーザー アプリがカーネルとどのように対話するかを理解するのに役立ちます。

于 2012-11-01T05:43:11.893 に答える
12

システム コールは、ユーザー レベルのコードとカーネルの間のインターフェイスです。C ライブラリ ルーチンは、他のルーチンと同様にライブラリ呼び出しであり、たまたま一般的に (ほぼ普遍的に) 提供されているだけです。多くの標準ライブラリ ルーチンは、システム コールのラッパー (薄いかどうかに関係なく) であり、境界線が少しあいまいになる傾向があります。

どちらを使用するかについては、原則として、ニーズに最も適したものを使用してください。

于 2009-02-21T13:09:09.433 に答える
6

マニュアルのセクション2で説明されている呼び出しはすべて、カーネルにトラップされるシステムサービスへの実際の呼び出しの比較的薄いラッパーです。マニュアルのセクション3で説明されているC標準ライブラリルーチンは、実際にシステムコールを使用する場合と使用しない場合があるクライアント側のライブラリ関数です。

この投稿には、システムコールとカーネルへのトラップ(わずかに異なるコンテキストで)の説明があり、いくつかの参照を使用してシステムコールの背後にある基本的なメカニズムを説明しています。

于 2009-02-21T14:00:25.287 に答える
4

原則として、常に C ライブラリ バージョンを使用する必要があります。多くの場合、シグナルでの再起動などの難解なことを処理するラッパーがあります (要求した場合)。これは、すでにライブラリにリンクしている場合に特に当てはまります。すべてのルールには、破る理由があります。直通電話を利用する理由

  1. あなたはlibc不可知論者になりたいです。多分インストーラーで。このようなコードは、使用するライブラリに関係なく、Android ( bionic )、uClibc、および従来の glibc/eglibc システムで実行できます。また、デュアル Android/Linux バイナリを可能にするランタイム glibc/bionic レイヤーを作成するためのラッパーによる動的読み込み。
  2. 究極のパフォーマンスが必要です。これはおそらくまれであり、おそらく見当違いですが。おそらく、問題を再考することでパフォーマンスが向上し、システムを呼び出さないlibcことでパフォーマンスが向上することがよくあります。
  3. ライブラリなしでコードを書いていinitramfsます。init小さいイメージを作成するか、起動を高速化します。
  4. あなたは新しいカーネル/プラットフォームをテストしていて、本格的なファイル システムで生活を複雑にしたくありません。に非常によく似ていinitramfsます。
  5. プログラムの起動時に何かを非常に迅速に実行したいが、最終的にはlibcルーチンを使用したいとします。
  6. の既知のバグを回避するためlibc
  7. この機能は では利用できませんlibc

申し訳ありませんが、ほとんどの例は Linux 固有のものですが、その根拠は他の Unix バリアントにも当てはまるはずです。最後の項目は、新しい機能がカーネルに導入されたときに非常に一般的です。たとえば、いつkqueueepollどこで最初に導入されたとしても、libcそれらをサポートするものはありませんでした。これは、システムに古いライブラリがあり、新しいカーネルがあり、この機能を使用したい場合にも発生する可能性があります。

プロセスが を使用していない場合はlibc、システム内の何かが使用されている可能性があります。独自のバリアントをコーディングすることで、同じ最終目標への 2 つのパスを提供してキャッシュを無効にすることができます。また、Unix はプロセス間でコード ページを共有します。libc通常、このバージョンを使用しない理由はありません。

他の回答は、システムコールとシステムコールの違いについてすでに優れた仕事をしていlibcます。

于 2013-03-24T04:45:43.310 に答える