質問: システムコールと標準ライブラリの正しい使い方を教えて下さい システムコールって何でしょうか。 c言語初心者なので、変な質問だったら、すみません。 システムコールと標準ライブラリにおける、関数の違いを教えて頂けませんでしょうか。 例えばファイル入出力で用いる openとfopenは何が違うのでしょうか? 私はそもそも、システムコールというものが判っていない状態です。 いつも標準ライブラリを参考にしていたものですから・・。 更に似た使い方をすると思いますが、使える範囲等どちらが広いのでしょうか。 よろしくお願いします。
回答: システムコールと標準ライブラリの違いは、プラットフォームによって話が違ってくるので、一概に「こう」とは言いきれないのですが。 元々、c言語は unix で使われていたので、まずはその部分から。 unix 上のcでは、システムコール関数を呼び出すと、渡されたパラメータをそのままカーネルシステムに渡し、結果が返って来るまで待って、アプリケーションに結果を返します。 ところが、unix には bsd 系の os と system-v 系の os と2種類の体系があり、また、同じ系列の unix でも機種による違い(方言)があり、パラメータや結果の返り方が微妙に違っているシステムコールがあります。 そうなると、機種ごとの微妙な違いを吸収する為の「標準的な何か」が必要になって来ます。 そこで用意されたのが、標準ライブラリです。 標準ライブラリは、unix の体系ごと、各機種ごとに合わせた物が用意され、出入り口のインターフェースが統一されています。os の仕様の違いはライブラリ関数内で吸収されます。 そうする事により、システムコールを使わず標準ライブラリのみ使っていれば、os の仕様が微妙に異なるシステムに移植する作業が安易になります。 (実行ファイル作成時に、機種ごとに用意されたライブラリファイルのどれを使うか指定するだけで済みます) ただ、標準ライブラリのみを使っていると、移植が安易になる反面、os の仕様の違いを吸収する為のオーバーヘッドがあり、速度的に遅くなる、実行コードが大きくなると言う短所があります。 その為、速度重視、コードサイズ重視で設計する場合や、やりたい事が標準ライブラリに無くシステムコールするしか無い場合もあり、システムコール関数を使わずに済ます事は出来ません。 そういった経緯で、c言語にはシステムコール関数と標準ライブラリ関数の両方が存在します。 で、時代は unix から ms-dos へと移って行きます。そして、c言語のシステムコール関数と標準ライブラリ関数の意味合いも、os の違いと共に移り変わって行きます。 unix と ms-dos では、カーネルシステムそのものがまったく違います。でも、unix 上で開発したソースコード資産を無駄にはしたくありません。 そこで、unix 用のシステムコール関数と同じような動きをする関数が ms-dos 用のライブラリとして用意され、同じく、標準ライブラリ関数も用意されました。そうすれば、unix から ms-dos への移植が容易になりますから。 つまり、os の違いをシステムコール関数内で吸収してしまった訳です。標準ライブラリ関数が unix の微妙な違いを関数内で吸収したのと同じような事をした訳ですね。 (ファイルの「テキスト」「バイナリ」の概念も、ここで取り入れられました。unix と ms-dos の「改行コード」の違いを吸収する為、テキストファイルを読む場合は cr+lf を lf に、書く場合は lf を cr+lf に変換する必要があったのです。アプリケーションは「改行は lf のみ」として作られている訳ですから) そういった訳で、ms-dos 用のc言語では、システムコール関数と標準ライブラリ関数の違いが曖昧になりました。どちらも「os の違いを関数内で吸収し、インターフェースを統一している」訳ですから。 そんな訳で「システムコール(関数)と標準ライブラリ(関数)における、関数の違いって何?」と言う疑問が湧くのも当然です。 (windows のコンソールアプリケーションを含む)ms-dos 系では、パラメータが違うだけで、内部でやっている事は同じような事なのですから。 「使える範囲等どちらが広いか」ですが、ここまで読んでお判りかと思いますが、標準ライブラリ関数の方が機種依存性は低く広範囲に使えます。但し、痒い所に手は届きません(汎用性を重視している為、最大公約数的な事しか出来ません) で、時代は ms-dos から更に windows へと進む訳ですが、ここで話は一変してしまいます。そう、guiの登場です(unix にもguiはあるのですが、ここでは割愛) guiの登場により、コンソールが使われなくなり、その変わりにウィンドゥ、マウスなど、グラフィカルな部分を扱う関数や、プロセス制御を行ったり、イベントを処理する必要が出て来ました。 その為、今までのシステムコール関数と標準ライブラリ関数は忘れ去られ、変わりにapi関数が登場しました。 c言語そのものも、guiを扱いやすくする為、クラスの概念を導入し、クラスの階層化を行ってc++に進化して来ました。 以上、長文になりましたが、回答になっているでしょうか?