ストリーム(システムコール編)
タイトル修正2010-05-04 13:00
ストリームとは
プロセスとプロセス間の通信、プロセスとファイル間との通信、ファイルとファイル間との通信ではストリームと呼ばれる概念によって行われます。
後述しますが、ここでいうストリームとは次の通り定義したものです。
- ファイルディスクリプタで表現されるもの
- read()またはwrite()で実行できるもの
ファイルディスクリプタとは
標準入出力など、ファイルへアクセスするためのストリームにアクセスする為に必要な情報です。
プロセス側ではただの整数値ですが、これをカーネル側に知らせる事によってプロセスからそのストリームへアクセスする事ができます。
ストリームを扱う
Perlで記述されたソースコードはプログラムです。このプログラムを起動するとプロセスが生成されます。
このプロセスからはストリームはただの整数(int)にしか見えません。
通常シェルからプロセスが起動した場合、どのプロセスにも3つのストリームが用意されています。
- 標準入力(0)
- 標準出力(1)
- 標準エラー出力(2)
このストリームはカーネル側で管理しており、プロセス側に直接アクセスさせません。
プロセス側から標準入力ストリームにアクセスするには0を指定します。
read(2)
ストリームからバイト列を読み込むにはred()というシステムコールを使います。
2という数字はシステムコールを表しています。
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
戻り値がssize_tという型を使用しています。
これはOS,CPU,Kernelのバージョンによる差異をなくすためです。
write(2)
#include <unistd.h> ssize_t write(int fd, void *buf, size_t count);
open(2)
pathにつながるストリームを作成し、そのストリームを指すファイルディスクリプタを返します。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int flags); int open(const char *path, int flags, mode_t mode);
close(2)
#include <unistd.h> int close(int fd);