Linuxのふつーのプログラミング
http://jibun.atmarkit.co.jp/lskill01/rensai/fulinux/02/01.html
いわく、
ファイルシステム プロセス ストリーム Linux世界はこの3つの概念によって成立しています。 つまり、Linuxプログラミングを理解するためにはこの3つの概念をよく理解しなければならないということです。
さまざまな事情から、ハードウェアと直接やりとりできるのはカーネルだけに(つまりデバイスドライバだけに)限定されているので、普通のプログラムがハードウェアを操作したいときはカーネルに仕事を頼んで間接的に操作するしかありません。カーネルはシステムで一番“偉い”プログラムですが、その一方では一番下っ端にいてこき使われるプログラムでもあるのです。
システムコール(system call)
open
read
write
fork
exec
stat
unlink
- ライブラリ関
システムコール以外にも使える関数
それがライブラリ関数(library function)です。
Linuxのライブラリは関数を貸してくれます。
これをリンク(link)と呼びます。
- libc
Linuxに用意されているライブラリはいろいろありますが,
その中で特に重要なのが標準Cライブラリ(standard C library)、通称libcです。すでにLinuxが動く環境があるなら、/libディレクトリを見てみてください。
そこにlibc.so.6というファイルがあるでしょう。これがlibcの中核です。
さらに、libc.so.6はシンボリックリンクになっているはずです。
どこを指しているのか「ls -l」で追跡してみましょう。
$ ls /lib/libc.so.6
/lib/libc.so.6
$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 13 Nov 23 2002 /lib/libc.so.6 -> libc-2.2.5.so
このように、私の環境ではlibc-2.2.5.soというファイルを指しています。
数字の部分はディストリビューションの種類やバージョンによって違いますが、
現時点では2.1から2.4の間のどれかになっているはずです。
Linuxで普通使われているlibcはGNU libc(略してglibc)と言って、
その名のとおりGNUプロダクトの一部です。先ほど説明したとおり、L
inuxカーネルはLinusさんが作っていますが、
GNU libcはまた別の人が作っています。この辺りの事情も「
Linuxはカーネルだけ」と言われる所以です。
続いて/libを眺めてみると、他にもlibm.so.6であるとかlibdl.so.2であるとか、
libnss何々といったファイルがありますね。
実はこれらも標準Cライブラリの一部です。
ライブラリはファイルだと述べましたが、
必ずしも1つのファイルとは限らないのです。
libm.so.6ならば数学関係の関数、例えばsin()やcos()が入っています。
/libにあるファイルは、ほとんどが標準Cライブラリを構成するファイルです。
■API
API(Application Programming Interface)というのは、何かを使ってプログラミングするときのインターフェイスのことを指します。例えば(Cの)ライブラリのAPIは関数やマクロです。カーネルのAPIはシステムコールです。また、場合によっては、設定ファイルや、LinuxコマンドなどもAPIに入ります。このように、 APIという言葉はプログラミングするときに使うものをほとんど包括する、語義の広い言葉なのです。
なぜこんなことを説明するかというと、世の中には「API」を「システムコール」と同じ意味だと思っている方がいるようだからです。その元凶は明らかに「Win32 API」でしょう。この言葉は本来「WindowsというOSの、Win32サブシステムのAPI」という意味で、その中にはシステムコール以外のものもたくさん含まれているのですが、なぜかシステムコールと同じものと解釈されてしまうことがあります。もしみなさんが勘違いしていたようなら、ここで本当の意味を覚えておきましょう。