device driver (2)

せっかくだからこのまま休み続けるか、と言いつつ再開検討。今の機能としては

  • デバイスのメジャー番号とドライバの登録ができた
  • その解放もできた
  • デバイス作って open/close ができた

という事で、できてない、というかできてなきゃイケないのは

  • open の排他制御
  • 異常時にきちんと errno 戻す

あと、read/write をきっちりデバッグしないとナニなんですが、その手法を見出すナニも含め試行錯誤が必要な模様。
とりあえず読み込み、書き込みの権限なソレはデバイスファイルの属性でコントロールする方向として、排他なソレを実装してみる事に。とりあえずデバイスファイルとして

  • fifo100130 (書き込み専用)
  • fifo101130 (読み込み専用)

限定という事で、実装してみます。とりあえず以下なソレを用意

# mknod fifo100130 c 130 100
# mknod fifo101130 c 130 101
# chmod 222 fifo100130

で、排他なソレを、という事でカウンタを用意

static int read_open, write_open;

あと、open/close で以下を盛り込んでみた。

static int yamanetoshi_open(struct inode *inode, struct file *file)
{
        printk("yamanetoshi_open\n");
        printk(" MINOR(inode->i_rdev): %d\n", MINOR(inode->i_rdev));

		if(0 == MINOR(inode->i_rdev) % 2) {
			if(0 == write_open) {
				write_open++;
			} else {
				return -EAGAIN;
			}
		} else {
			if(0 == read_open) {
				read_open++;
			} else {
				return -EAGAIN;
			}
		}
        return 0;
}

static int yamanetoshi_release(struct inode *inode, struct file *file)
{
        printk("yamanetoshi_close\n");
		if(0 == MINOR(inode->i_rdev) % 2)
			write_open = 0;
		else
			read_open = 0;

        return 0;
}

で、ある端末で cat

# cat > ./fifo100130

違う端末で同じコマンドをタタいたら

$ cat ./fifo100130
cat: ./fifo100130: 許可がありません
$

との事。ええのかどうか微妙。