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));
}