seek接口

来源:互联网 发布:淘宝店铺号码怎么查找 编辑:程序博客网 时间:2024/04/29 11:59

seek接口用来对设备的读写位置进行定位。file_operations结构中对应的seek接口如下:

  1. loff_t (*llseek) (struct file *filp, loff_t off, int whence) 

其中off是偏移量,whence参数指起点位置。

例1.6  字符设备seek实例

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

  1. ssize_t simple_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)  
  2. {  
  3.     loff_t pos= *f_pos;//获取文件指针  
  4.     if(pos>=256)  
  5.     {  
  6.         count=0;  
  7.         goto out;  
  8.     }  
  9.     if(count>(256-pos))  
  10.     {  
  11.         count=256-pos;  
  12.     }  
  13.     pos += count;  
  14.     //复制数据到指定的地址  
  15.     if (copy_to_user(buf,demoBuffer+*f_pos,count))  
  16.     {  
  17.        count=-EFAULT;   
  18.        goto out;  
  19.     }  
  20.     *f_pos = pos;  
  21.  out:  
  22.     return count;  
  23. }  
  24. loff_t simple_llseek(struct file *filp, loff_t off, int whence)  
  25. {  
  26.     loff_t pos;  
  27.     pos = filp->f_pos;  
  28.     switch (whence)   
  29.     {  
  30.     case 0:  
  31.         pos = off;  
  32.         break;  
  33.     case 1:  
  34.         pos += off;  
  35.         break;  
  36.     case 2:  
  37.         pos =255+off;  
  38.         break;  
  39.     default:  
  40.         return -EINVAL;  
  41.     }  
  42.     if ((pos>=256) || (pos<0))   
  43.     {  
  44.         return -EINVAL;  
  45.     }  
  46.     return filp->f_pos=pos;  
  47. }  
  48. struct file_operations simple_fops = {  
  49.     .owner =    THIS_MODULE,  
  50.     .llseek =   simple_llseek,  
  51.     .read =     simple_read,  
  52.     .open =     simple_open,  
  53.     .release =  simple_release,  
  54. };  

应用程序参考代码如下:
  1. void main()  
  2. {  
  3.     int fd;  
  4.     int i;  
  5.     char data[256];  
  6.     int retval;  
  7.     fd=open("/dev/fgj",O_RDWR);  
  8.     if(fd==-1)  
  9.     {  
  10.         perror("error open\n");  
  11.         exit(-1);  
  12.     }  
  13.     printf("open /dev/fgj successfully\n");  
  14.     retval=lseek(fd,5,0);  
  15.     if(retval==-1)  
  16.     {  
  17.         perror("lseek error\n");  
  18.         exit(-1);  
  19.     }  
  20.     retval=read(fd,data,3);  
  21.     if(retval==-1)  
  22.     {  
  23.         perror("read error\n");  
  24.         exit(-1);  
  25.     }  
  26.     data[retval]=0;  
  27.     printf("read successfully:%s\n",data);  
  28.     //文件定位  
  29.     retval=lseek(fd,2,0);  
  30.     if(retval==-1)  
  31.     {  
  32.         perror("lseek error\n");  
  33.         exit(-1);  
  34.     }  
  35.     retval=read(fd,data,3);  
  36.     if(retval==-1)  
  37.     {  
  38.         perror("read error\n");  
  39.         exit(-1);  
  40.     }  
  41.     data[retval]=0;  
  42.     printf("read successfully:%s\n",data);  
  43.     close(fd);  
  44. }  

本例运行结果如下:
  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. read successfully:FGH  
  6. read successfully:CDE  
0 0
原创粉丝点击