ストリーム(システムコール編)

タイトル修正2010-05-04 13:00

ストリームとは

プロセスとプロセス間の通信、プロセスとファイル間との通信、ファイルとファイル間との通信ではストリームと呼ばれる概念によって行われます。

後述しますが、ここでいうストリームとは次の通り定義したものです。

  • ファイルディスクリプタで表現されるもの
  • read()またはwrite()で実行できるもの

ファイルディスクリプタとは

標準入出力など、ファイルへアクセスするためのストリームにアクセスする為に必要な情報です。
プロセス側ではただの整数値ですが、これをカーネル側に知らせる事によってプロセスからそのストリームへアクセスする事ができます。

ストリームを扱う

Perlで記述されたソースコードはプログラムです。このプログラムを起動するとプロセスが生成されます。

このプロセスからはストリームはただの整数(int)にしか見えません。

通常シェルからプロセスが起動した場合、どのプロセスにも3つのストリームが用意されています。

このストリームはカーネル側で管理しており、プロセス側に直接アクセスさせません。
プロセス側から標準入力ストリームにアクセスするには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);

SEE ALSO

次のコマンドでシステムコールのドキュメントを見ることができます。
この時セクション番号2を指定して下さい。

「man read」と記述するとbashの組み込み関数のreadを参照したりします。

man 2 read
man 2 write
man 2 open
man 2 close

man-pages-jaが入ってない場合は次のように

% sudo yum install man-pages-ja

参考文献

  • ふつうのLinuxプログラミング(青木峰郎著)
  • Linuxカーネル解読室2.6(高橋浩和/小田逸朗/山幡為佐久著)