第4回 プロセスとファイルシステムをつなぐストリームの概念
青木峰郎
2008/12/4
ストリーム |
3つの重要概念の最後はストリーム(stream)です。英語でstreamと言えば「何かの細い流れ」のことですね。例えば渓流などはstreamです。また、「ジェット気流」はjet streamの訳語です。本書でストリームと言う場合は、水でも空気でもなく、バイトの流れ、つまりバイトストリーム(byte stream)のことを指します。ストリームとは、バイト列が流れる通り道だと考えてください。より厳密な定義は、第5章でAPIを紹介したあとに示します。
なお、ここでお話しする「ストリーム」という用語の使い方は本書独自のもので、他のLinuxの書籍には本連載で言うところのストリームは明確には出てきません。しかし、説明する上ではストリームという概念を持ってきたほうがシンプルになるので、あえて使うことにしました。本書で言うストリームは他書では単に「ファイル」や「open file」と呼ばれていますから覚えておいてください。さらに、LinuxやUNIXに関する他書では、ストリームという語を次の2つの意味で使うことがあります。
●FILE型の値
●STREAMSカーネルモジュール
FILE型については書籍『ふつうのLinuxプログラミング』の第6章で話します。本書で言うストリームを操作するときに使うデータ構造です。
STREAMSというのは、本書で言うストリームを提供するために使われるカーネルのモジュールのことです。
しかし、本書で話すストリームは、このどちらとも違います。本書で単にストリームと書いたら例外なくバイトストリームのことです。
■ファイルにつながったストリーム
ストリームはLinuxのいろいろなところで使われます。例えばプロセスがファイルの内容にアクセスしたいときは、どうするのでしょうか。そういうときは、ファイルにつながるストリームを作ってもらえるようカーネルに(システムコールを使って)頼みます。そしてまたシステムコールを使い、ストリームを操作してファイルの中身を取り出せばよいのです(図1)。
図1 ファイルとストリーム |
なお、プログラミングの世界ではストリームからバイト列を取り出すことを単に読む(read)と言います。その逆に、バイト列を流し込むことは書く(write)と言います。「ストリームからバイト列を読む」「ストリームにバイト列を書く」「ファイルの内容を読む」「ファイルに書く」などのように使います。
■デバイスにつながったストリーム
ストリームの使い道はまだまだあります。先ほどの例ではストリームの向こう側には普通のファイルがありましたが、バイト列の流れとして考えられるものであればどんなものでもストリームにつなぐことができます。つまり、ストリームであるかのように扱うことができるということです。
例えばハードディスクやキーボードのようなハードウェアも例外ではありません。ハードディスクは「バイトの塊」のようなハードウェアですから、ごく自然に普通のファイルと同じようにストリームで扱うことができます。キーボードも、押下されたキーを表すバイトの列を送りつけてくるストリームだと考えると納得できます(図2)。
図2 ストリームとデバイスファイル |
デバイスファイルは、実はこのようなストリームを得るための“とっかかり”として存在するのです。
■パイプ
バイト列が出たり入ったりするものならば、何でもストリームです。そこで、先ほどの図1を見てください。プロセスにストリームがつながって、バイト列が出たり入ったりしていますね。ということは、ストリームの両端にプロセスがいても特に問題はなさそうです(図3)。このようなストリームをパイプ(pipe)と呼びます。
図3 パイプ |
みなさんパイプはご存知ですね。コマンドの出力をlessコマンドで見たり、grepコマンドで検索したりするときには、パイプを使います。そのような動作は、
●まず各コマンドを独立したプロセスとして同時に実行する
●そのプロセス間をストリーム(パイプ)でつなぐ
という仕組みによって成り立っています。
■ネットワーク通信
ストリームの話を続けましょう。
ストリームとはバイト列の通り道でした。それならば、バイト列がちゃんと輸送される限り、ストリームが別のコンピュータにまで延びていても何も問題はないでしょう(図4)。これがネットワーク通信(network communication)です。
図4 ネットワーク通信 |
別のコンピュータのファイルにつなげてもよいのですが、現実にはプロセスにつなぐことが多いので、図4でも向こう側にはプロセスを置きました。
■プロセス間通信
パイプやネットワーク通信のように、プロセス同士がストリームを通じてデータをやりとりしたり意思の疎通をはかることを一般にプロセス間通信(IPC:InterProcess Communication)と言います。ストリームはプロセス間通信において重要な役割を担っています。
ただし、ストリームだけが唯一のプロセス間通信機構というわけではありません。例えばSystem V IPC(セマフォと共有メモリとメッセージキュー)と呼ばれるシステムは、ストリームを使わないプロセス間通信機構です。
■3大重要概念のまとめ
これで3つの重要概念が出揃いました。まず、データに名前を付けて保存する場所としてのファイルシステムがあります。次に、何らかの活動をする主体としてのプロセスがあります。最後に、プロセスがファイルシステムや他のプロセスとデータをやりとりする手段としてのストリームがあります。
この三者の関係をまとめると図5のようになります。
図5 プロセス、ファイルシステム、ストリーム |
書籍『ふつうのLinuxプログラミング』の第2〜3章を転載した連載は、今回で終了です。4回にわたりご愛読ありがとうございました。
本連載は、ソフトバンククリエイティブ刊行の『ふつうのLinuxプログラミング』のうち第1部「Linuxの仕組み」の中から「第2章 Linuxカーネルの正解」と「第3章 Linuxを描き出す3つの概念」を、同社の許可を得て転載するものです。 本書は、LinuxにおけるC言語プログラミングの入門書です。「Linuxの世界が何でできているのか」に着目し、「ファイルシステム」「プロセス」「ストリーム」という3つの概念を紹介しています。 なお、本連載は転載を行っているため@IT自分戦略研究所の表記とは一部異なる点があります。ただし、Webで掲載するに当たり、(例えば「本書は」としている部分は「本連載は」としていること、図版などの省略など)、表現を若干変更している点がありますが、その点ご了承ください。 |
関連記事 |
Linuxに触れよう |
LPICに見るLinuxを学ぶ意味とは |
実践でも役立つLPICドリル インデックス |
Linuxをいまから学ぶコツ教えます |
第1回 Linux認定資格・試験の世界 |
@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。
現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。
これからも、@IT自分戦略研究所をよろしくお願いいたします。