マンページには複数のセクションがあります。それらの2つは次のとおりです。
2 つの Unix および C システム コール 3 C プログラム用の C ライブラリルーチン
たとえばと がgetmntinfo(3)
ありgetfsstat(2)
、どちらも同じことをしているように見えます。どちらをいつ使用する必要があり、違いは何ですか?
マンページには複数のセクションがあります。それらの2つは次のとおりです。
2 つの Unix および C システム コール 3 C プログラム用の C ライブラリルーチン
たとえばと がgetmntinfo(3)
ありgetfsstat(2)
、どちらも同じことをしているように見えます。どちらをいつ使用する必要があり、違いは何ですか?
一般的な関数のライブラリはシステム コール インターフェイスの上に構築されますが、アプリケーションは両方を自由に使用できます。
システム コールは、カーネル リソースを使用するためのアクセス権を持つ認証キーのようなものです。
上の画像は高度な Linux プログラミングからのもので、ユーザー アプリがカーネルとどのように対話するかを理解するのに役立ちます。
システム コールは、ユーザー レベルのコードとカーネルの間のインターフェイスです。C ライブラリ ルーチンは、他のルーチンと同様にライブラリ呼び出しであり、たまたま一般的に (ほぼ普遍的に) 提供されているだけです。多くの標準ライブラリ ルーチンは、システム コールのラッパー (薄いかどうかに関係なく) であり、境界線が少しあいまいになる傾向があります。
どちらを使用するかについては、原則として、ニーズに最も適したものを使用してください。
マニュアルのセクション2で説明されている呼び出しはすべて、カーネルにトラップされるシステムサービスへの実際の呼び出しの比較的薄いラッパーです。マニュアルのセクション3で説明されているC標準ライブラリルーチンは、実際にシステムコールを使用する場合と使用しない場合があるクライアント側のライブラリ関数です。
この投稿には、システムコールとカーネルへのトラップ(わずかに異なるコンテキストで)の説明があり、いくつかの参照を使用してシステムコールの背後にある基本的なメカニズムを説明しています。
原則として、常に C ライブラリ バージョンを使用する必要があります。多くの場合、シグナルでの再起動などの難解なことを処理するラッパーがあります (要求した場合)。これは、すでにライブラリにリンクしている場合に特に当てはまります。すべてのルールには、破る理由があります。直通電話を利用する理由
libc
不可知論者になりたいです。多分インストーラーで。このようなコードは、使用するライブラリに関係なく、Android ( bionic )、uClibc、および従来の glibc/eglibc システムで実行できます。また、デュアル Android/Linux バイナリを可能にするランタイム glibc/bionic レイヤーを作成するためのラッパーによる動的読み込み。libc
ことでパフォーマンスが向上することがよくあります。initramfs
ます。init
小さいイメージを作成するか、起動を高速化します。initramfs
ます。libc
ルーチンを使用したいとします。libc
。libc
。申し訳ありませんが、ほとんどの例は Linux 固有のものですが、その根拠は他の Unix バリアントにも当てはまるはずです。最後の項目は、新しい機能がカーネルに導入されたときに非常に一般的です。たとえば、いつkqueue
、epoll
どこで最初に導入されたとしても、libc
それらをサポートするものはありませんでした。これは、システムに古いライブラリがあり、新しいカーネルがあり、この機能を使用したい場合にも発生する可能性があります。
プロセスが を使用していない場合はlibc
、システム内の何かが使用されている可能性があります。独自のバリアントをコーディングすることで、同じ最終目標への 2 つのパスを提供してキャッシュを無効にすることができます。また、Unix はプロセス間でコード ページを共有します。libc
通常、このバージョンを使用しない理由はありません。
他の回答は、システムコールとシステムコールの違いについてすでに優れた仕事をしていlibc
ます。