copy and destroy

catch and eat

read(2) / write(2)

日記の練習です。

『ふつうの Linux プログラミング』第5章「ストリームにかかわるシステムコール」の話

5.4 ストリームの読み書き

read(2)

read(2) の話になったところで、なにが書かれているのか全然わからなくなりました。 void *buf とは?写経しとくか。

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t bufsize);

戻り値の形は ssize_t 、引数の形は size_t とあります。
これはどちらも sys/type.h で定義されているデータ型で、基本的な整数型の別名にすぎません。つまり int 型や long 型です。
ssize_t は符号付き整数型、
size_t は符号なし整数型として定義されています。

read() は、ファイルディスクリプタ fd 番のストリームからバイト列を読み込むシステムコールです。
最大 bufsize バイト読み、 buf に格納します。 buf のサイズをそのまま bufsize に指定するのが一般的な使い方です。

read() は、読み込みが問題なく完了したときは読み込んだバイト数を返します。
ファイル終端に達したときは 0 を、
エラーが起きたときは -1 を返します。
read() では bufsize バイトより少ないバイト数しか読まないケースも頻発するので、必ず戻り値をチェックします。

void *p は、ポインタ変数というのか。ポインタはまったくわからない。 void 型はなんとなくわかる(全然わかっていない)。

wirte(2)

write(2) も写経しとく。const void *buf とは?

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t bufsize);

write() は、 bufsize バイト分を buf からファイルディスクリプタ fd 番のストリームに書き込みます。
戻り値の型は ssize_t なので、符号付き整数です。正常に書き込んだときは書いたバイト数を返します。エラーが起きたときは -1 を返します。

write() が bufsize バイトをすべて書けない状況は比較的少ないですが、現実的な確率で発生します。厳密な処理が必要な場面では戻り値をチェックするべきです。

ストリームの定義

3.3 ストリーム

3つの重要概念(ファイルシステム、プロセス、ストリーム)*1です。

本書でストリームという場合には、バイトストリーム(byte stream)のことを指します。

なお、ここでお話する「ストリーム」という用語の使い方は本書の独自のもので、他の Linux の書籍には本書でいうところのストリームは明確には出てきません。

他書では「ファイル」や "open file" と呼ばれていますから覚えておいてください。

5.4 ストリームの読み書き

ストリームの定義

本書のストリームとは、ファイルディスクリプタで表現され、 read() または write() で操作できるもののことです。
ファイルを open() すると read() または write() を実行できるものが作られますから、そこにはストリームがあります。

パイプやネットワークソケットも、やはりストリームの仲間です。

*1: Linux 世界はこの3つの概念によって成立しています。つまり Linux プログラミングを理解するためにはこの3つの概念をよく理解しなければならないということです。そして、それこそが本書の目的です。 https://copyanddestroy.hatenablog.com/entry/2025/02/07/180937

powered by hatena blog.
the nikki system for lifelogging junkies.

all posts © their original owners.
writing is reusable solely under the by creative commons license.