read/write の実装

そろそろヤらねば。とりあえずテキストに書いてあるのは

  • 空の FIFO デバイスから読みとる場合
    • 対抗する端が open されていないなら、EOF を戻す
    • そうでない場合、読み取り操作を呼び出したプロセスをブロック

との事。最初誤解してたんですが常にブロックする訳ではないのか。

もう少し整理

ええと使ってるのは 2.6.20 なんですが、read/write のプロトタイプが以下

	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

ええと LinuxKernelHackJapan の file_operations 構造体のページによると read は

オフセット loff_t で指定される位置から開始し、size_t で指定されるバイト数をファイルから読み込む。その後、オフセット loff_t を更新する

との事。あるいは write は

オフセット loff_t で指定される位置から開始し、size_t で指定されるバイト数をファイルへ書き込む。その後、オフセット loff_t を更新する

との事。今回はファイルは関係ないんだけど、内部的にバッファ持ってて云々なソレをナニ。こーゆーのは簡単な実装から考えた方が良いはずなので配列でリングバッファが云々ってのはどうか。サイズは限定で。
ちょっとシステムコール側のプロトタイプも控えとく

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

バッファをこんなカンジにしといて

#define FIFO_BUF_SIZE 50
static char buf[FIFO_BUF_SIZE];

25 bytes づつ読む方向 (弱
で、これを queue にしようと思ったら添字が FIFO_BUF_SIZE になったら 0 にすれば良いはず。これ、先頭とどこまで、を管理しとかないと sleep_on もクソもないのかな。

int top;
int end;

てーコトは 25bytes 読み込み限定で考えたとして top の値によって云々。

  • top + 読み込みサイズ が FIFO_BUF_SIZE - 1 未満なら end の値で判断可能
  • top + 読み込みサイズ が FIFO_BUF_SIZE - 1 以上なら (FIFO_BUF_SIZE - 1) - (読み込みサイズ + top) と end の値で判断可能

この判断マターで sleep_on するかどうかを決めれば良いのか。_空の FIFO デバイス_というソレをどう定義するのか、は微妙かなぁ。
このあたりは抽象化なナニ的に一番面白いあたりに違いないんですがちょっと限界かも。