ioctl接口

来源:互联网 发布:淘宝店铺号码怎么查找 编辑:程序博客网 时间:2024/05/17 08:43

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,程序可以通过ioctl向设备发送命令、参数配置等信息。file_operations结构中对应的ioctl接口如下:

  1. int (*ioctl) (struct inode *inode, struct file 
    *filp,unsigned int cmd, unsigned long arg); 

其中cmd是命令类型,arg是参数。

例1.5  字符设备ioctl实例

代码见光盘\src\1drivermodel\1-5ioctl。核心代码如下所示:

  1. //内核ioctl接口  
  2. int simple_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg)  
  3. {  
  4.     switch(cmd)  
  5.     {  
  6.         case COMMAND1:  
  7.             memset(demoBuffer,0x31,256);  
  8.             break;  
  9.         case COMMAND2:  
  10.             memset(demoBuffer,0x32,256);  
  11.             break;  
  12.         default:  
  13.             return -EFAULT;  
  14.             break;  
  15.     }  
  16.     return 0;  
  17. }  
  18. struct file_operations simple_fops = {  
  19.     .owner =    THIS_MODULE,  
  20.     .ioctl =    simple_ioctl,  
  21.     .open =     simple_open,  
  22.     .release =  simple_release,  
  23. };  

接下来编写一个应用程序,参考代码如下:
  1. #define COMMAND1 1  
  2. #define COMMAND2 2  
  3. void main(void)  
  4. {  
  5.     int fd;  
  6.     int i;  
  7.     char data[256];  
  8.     int retval;  
  9.     fd=open("/dev/fgj",O_RDWR);  
  10.     if(fd==-1)  
  11.     {  
  12.         perror("error open\n");  
  13.         exit(-1);  
  14.     }  
  15.     printf("open /dev/fgj successfully\n");  
  16.     //应用层IOCTL控制  
  17.     retval=ioctl(fd,COMMAND1,0);  
  18.     if(retval==-1)  
  19.     {  
  20.         perror("ioctl error\n");  
  21.         exit(-1);  
  22.     }  
  23.     printf("send command1 successfully\n");  
  24.     retval=ioctl(fd,COMMAND2,0);  
  25.     if(retval==-1)  
  26.     {  
  27.         perror("ioctl error\n");  
  28.         exit(-1);  
  29.     }  
  30.     printf("send command1 successfully\n");  
  31.     close(fd);  
  32. }  

本例运行结果如下:
  1. [root@urbetter /home]# insmod demo.ko   
  2. [root@urbetter /home]# mknod /dev/fgj c 224 0  
  3. [root@urbetter /home]# ./test  
  4. open /dev/fgj successfully  
  5. send command1 successfully  
  6. send command1 successfully  


0 0
原创粉丝点击