ubuntu8.10上でrubyによってCDのトレイの状態を調べる
以下を実行すると
- 1
- ディスクが入っていないとき
- 2
- トレイが開いているとき
- 3
- ドライブまちのとき
- 4
- ディスクが刺さっているとき
が返ってくる。
ruby版
今のところrubyが一番使いやすそうだな。
ioctlの番号は/usr/include/linux/cdrom.hを参照のこと
>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io| puts io.ioctl(0x5326)} 1 => nil >> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io| puts io.ioctl(0x5326)} 2 => nil
ちなみにejectとcloseは
>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io|io.ioctl(0x5309)} => 0 >> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io|io.ioctl(0x5319)} => 0
perl版
うまくできない。sysopenでトレイが閉じてしまう。そうか、perlのsysopenはopenで実装されているので…
$ sysopen(fd,"/dev/cdrom",O_RDONLY|O_NONBLOCK);$buf="";print ioctl(fd,0x5326,$buf) 1
C版
まあ、普通に考えるとこれだよな。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <linux/cdrom.h> int main() { printf("%d\n",ioctl(open("/dev/cdrom",O_RDONLY|O_NONBLOCK),CDROM_DRIVE_STATUS)); }