使用ioctl函数操作光驱设备,可以通过CDROM_LOCKDOOR来锁住光驱,使其无法弹出
#include
#include
#include
#include
#include
#include
int main(int argc,char **argv)
{
int fd;
if(argc != 2){
printf("Usage:%s 0|1",argv[0]);
return -1;
}
fd = open("/dev/sr1",O_RDONLY|O_NONBLOCK); ///dev/sr1为光驱设备文件
if(fd < 0){
perror("open error");
return -1;
}
if(strcmp(argv[1],"1") == 0){
if(!ioctl(fd,CDROM_LOCKDOOR,1)){ //锁住光驱,不让其弹出
printf("cdrom lockdoor success\n");
}
}else{
if(!ioctl(fd,CDROM_LOCKDOOR,0)){ //解锁光驱,让其可以弹出
printf("cdrom unlockdoor success\n");
}
}
return 0;
}
将上面代码编译生成ioctlcdrom可执行程序,执行ioctlcdrom 1 锁住光驱
ioctlcdrom 0解锁光驱
为了更好的控制光驱,在光驱接入系统时就可对其进行控制,可使用linux系统的设备管理udev,结合上面的可执行程序,可以实现自动锁定和解锁光驱设备
使用udev规则对cdrom控制只需要在/etc/udev/rules.d/目录下创建一个规则文件10-test.rules,并写入以下规则
SUBSYSTEM=="block", KERNEL=="sr[0-9]*", SYMLINK+="scd%n", GROUP="cdrom" RUN+="/usr/bin/my_test1"
SUBSYSTEM=="block", KERNEL=="hd*", SUBSYSTEMS=="ide", ATTRS{media}=="cdrom", GROUP="cdrom"
同时需要在/usr/bin/目录下生成一个shell文件my_test1,文件中包含以下内容:
#!/bin/sh
ioctlcdrom 1
为了执行ioctlcdrom程序方便,将ioctlcdrom程序放到/usr/bin目录下
此时就可在光驱加载时自动锁住光驱
以下是弹出光驱的功能实现:
#include
#include
#include
#include
int main(void)
{
int fd =open("/dev/cdrom", O_RDONLY | O_NONBLOCK);
// ioctl(fd, CDROM_LOCKDOOR, 0);
if (!ioctl(fd, CDROMEJECT, NULL)) {
printf("eject cdromsucceed\n");
} else {
printf("eject cdromfailed\n");
}
/*
sleep(5);
// ioctl(fd, CDROM_LOCKDOOR, 1);
if (!ioctl(fd, CDROMCLOSETRAY, NULL)) {
printf("close cdromsucceed\n");
} else {
printf("close cdromfailed\n");
}
*/
return 0;
}
阅读(2586) | 评论(0) | 转发(0) |