マンページには複数のセクションがあります。それらのうちの2つは、以下のとおりです。たとえば「Cシステムコール」と「Cライブラリルーチン」の違いは何ですか?
2 Unix and C system calls 3 C Library routines for C programs
がgetmntinfo(3)
とgetfsstat(2)
があり、彼らは同じことを行うように両方が見えます。誰がどちらを使い、その違いは何ですか?
マンページには複数のセクションがあります。それらのうちの2つは、以下のとおりです。たとえば「Cシステムコール」と「Cライブラリルーチン」の違いは何ですか?
2 Unix and C system calls 3 C Library routines for C programs
がgetmntinfo(3)
とgetfsstat(2)
があり、彼らは同じことを行うように両方が見えます。誰がどちらを使い、その違いは何ですか?
システムコールは、ユーザーレベルコードとカーネルの間のインターフェイスです。 Cライブラリルーチンは他のライブラリ呼び出しと同じように、まったく一般的に提供されています(かなり普遍的な)。標準ライブラリルーチンの多くは、システムコールの周りのラッパー(薄型またはそれ以外のもの)で、ラインを少しぼかしてしまいがちです。
どのようなものを使用するかは、原則として、お客様のニーズに最も適したものを使用してください。
マニュアルの第2章で説明した呼び出しは、実際にカーネルにトラップするシステムサービスへの実際の呼び出しの周りに比較的薄いラッパーです。マニュアルのセクション3で説明されているC標準ライブラリルーチンは、実際にシステムコールを使用する場合も使用しない場合もあるクライアント側ライブラリ関数です。
This postingには、システムコールとカーネルへのトラップ(わずかに異なるコンテキスト)の説明があり、システムコールの背後にあるメカニズムといくつかの参照があります。
共通関数のライブラリは、システムコールインタフェースの上に構築されますが、アプリケーションは両方を自由に使用できます。
システムコールは、カーネルリソースを使用するためのアクセス権を持つ認証キーのようなものです。画像の上
先進のLinuxプログラミングからであり、ユーザーのアプリケーションがカーネルとの対話方法を理解するのに役立ちます。
原則として、常に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
とシステムコールの違いについて、恒星の仕事をしています。
awesome pic。非常に明確な – henryyao