第2回 システムコールとライブラリ関数
青木峰郎
2008/10/20
本連載では、Linuxで行うC言語プログラミングを初歩から解説します。ただし、C言語の基礎とLinuxでエディタが使えること、cd、ls、cat、lessといった基本的なコマンドを知っていることが前提になります。C言語の入門書を読み終えた人、WindowsでCやC++を使ってプログラミングをしていた人で、これからLinuxでのプログラミングを学びたい人、プログラミングを通じてLinuxの仕組みを理解したい人、LinuxやUNIXプログラミングに関するほかの書籍を読んだが難しくて挫折した人に向け、Linuxプログラミングの仕組みを解説します。 |
前回の「Linuxカーネルの作り出す世界」では、LinuxOSとLinuxカーネルの概念について学習しました。今回は、OSの一部であるライブラリの概要を学習しましょう。
◆今回学ぶこと |
・ライブラリとライブラリ関数 |
・システムコールとライブラリ関数 |
・libc |
・API |
本連載は、ソフトバンククリエイティブ刊行の『ふつうのLinuxプログラミング』のうち第1部「Linuxの仕組み」の中から「第2章 Linuxカーネルの正解」と「第3章 Linuxを描き出す3つの概念」を、同社の許可を得て転載するものです。 本書は、LinuxにおけるC言語プログラミングの入門書です。「Linuxの世界が何でできているのか」に着目し、「ファイルシステム」「プロセス」「ストリーム」という3つの概念を紹介しています。 なお、本連載は転載を行っているため@IT自分戦略研究所の表記とは一部異なる点があります。ただし、Webで掲載するに当たり、(例えば「本書は」としている部分は「本連載は」としていること、図版などの省略など)、表現を若干変更している点がありますが、その点ご了承ください。 |
■ライブラリとライブラリ関数
我々がプログラミングをする上では、システムコール以外にも使える関数があります。それがライブラリ関数(library function)です。ライブラリ関数の例としては、前章で使ったprintf()やexit()、それに文字列処理関数のstrlen()やstrcpy()などが挙げられます。
ライブラリ関数はなぜライブラリ関数と言うのでしょうか。それはライブラリ(library)に収められているからです。
「library」は英語で「図書館」という意味ですね。普通の図書館は建物であり、その中には本がたくさん置いてありますが、Linuxのライブラリはファイルであり、その中には関数(のコード)がたくさん入っています。
また、普通の図書館は本を貸してくれますが、Linuxのライブラリは関数を貸してくれます。これをリンク(link)と呼びます。関数をリンクしておくと(つまり借りておくと)、その関数を呼び出すことができるようになります。
■システムコールとライブラリ関数
ライブラリ関数は内部でシステムコールを使って実装されていることもありますし、ライブラリ関数だけで完結していることもあります。例えば、前章でも使った関数printf()はライブラリ関数で、その内部ではwrite()というシステムコールを使っています。しかし、strlen()という関数もライブラリ関数ですが、システムコールは使っていません。
また、実はシステムコールとライブラリ関数の区別は曖昧で、昔はシステムコールだった手続きも今はライブラリ関数として実装されていることがありますし、その逆もあります。そういった意味では、システムコールとライブラリ関数の違いを本気で意識しなければならないのはカーネルや基幹ライブラリを書くプログラマくらいと言えるかもしれません。
システムコールとライブラリ関数の違いが実際に役に立つのは、manページを参照するときです。例えば「printf」にはコマンドのprintfとライブラリ関数のprintfがあるので、ライブラリ関数のprintfの解説が見たければ「man 3 printf」と入力しないといけません。「write」にはコマンドのwriteとシステムコールのwriteがあるので、システムコールのほうが読みたければ「man 2 write」と入力しないといけません。
逆に言えば、最初のうちはその程度しか違いがないのですが、「システムコール」や「ライブラリ関数」くらいはプログラマならば常識の範囲なので覚えておきましょう。
結構勘違いされている? APIの正しい意味 |
@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。
現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。
これからも、@IT自分戦略研究所をよろしくお願いいたします。