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: 許可がありません $
との事。ええのかどうか微妙。