Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336638
  • 博文数量: 64
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 589
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-08 15:50
文章分类

全部博文(64)

文章存档

2015年(52)

2014年(3)

2013年(9)

我的朋友

分类: LINUX

2015-06-02 18:25:07

使用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) |
给主人留下些什么吧!~~