日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

seek接口

發布時間:2024/9/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 seek接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

seek接口用來對設備的讀寫位置進行定位。file_operations結構中對應的seek接口如下:

  • loff_t?(*llseek)?(struct?file?*filp,?loff_t?off,?int?whence)?
  • 其中off是偏移量,whence參數指起點位置。

    例1.6? 字符設備seek實例

    代碼見光盤\src\1drivermodel\1-6lseek。核心代碼如下所示:

  • ssize_t?simple_read(struct?file?*filp,?char?__user?*buf,?size_t?count,loff_t?*f_pos) ?
  • { ?
  • ????loff_t?pos=?*f_pos;//獲取文件指針 ?
  • ????if(pos>=256) ?
  • ????{ ?
  • ????????count=0; ?
  • ????????goto?out; ?
  • ????} ?
  • ????if(count>(256-pos)) ?
  • ????{ ?
  • ????????count=256-pos; ?
  • ????} ?
  • ????pos?+=?count; ?
  • ????//復制數據到指定的地址 ?
  • ????if?(copy_to_user(buf,demoBuffer+*f_pos,count)) ?
  • ????{ ?
  • ???????count=-EFAULT;? ?
  • ???????goto?out; ?
  • ????} ?
  • ????*f_pos?=?pos; ?
  • ?out: ?
  • ????return?count; ?
  • } ?
  • loff_t?simple_llseek(struct?file?*filp,?loff_t?off,?int?whence) ?
  • { ?
  • ????loff_t?pos; ?
  • ????pos?=?filp->f_pos; ?
  • ????switch?(whence)? ?
  • ????{ ?
  • ????case?0: ?
  • ????????pos?=?off; ?
  • ????????break; ?
  • ????case?1: ?
  • ????????pos?+=?off; ?
  • ????????break; ?
  • ????case?2: ?
  • ????????pos?=255+off; ?
  • ????????break; ?
  • ????default: ?
  • ????????return?-EINVAL; ?
  • ????} ?
  • ????if?((pos>=256)?||?(pos<0))? ?
  • ????{ ?
  • ????????return?-EINVAL; ?
  • ????} ?
  • ????return?filp->f_pos=pos; ?
  • } ?
  • struct?file_operations?simple_fops?=?{ ?
  • ????.owner?=????THIS_MODULE, ?
  • ????.llseek?=???simple_llseek, ?
  • ????.read?=?????simple_read, ?
  • ????.open?=?????simple_open, ?
  • ????.release?=??simple_release, ?
  • }; ?
  • 應用程序參考代碼如下:
  • void?main() ?
  • { ?
  • ????int?fd; ?
  • ????int?i; ?
  • ????char?data[256]; ?
  • ????int?retval; ?
  • ????fd=open("/dev/fgj",O_RDWR); ?
  • ????if(fd==-1) ?
  • ????{ ?
  • ????????perror("error?open\n"); ?
  • ????????exit(-1); ?
  • ????} ?
  • ????printf("open?/dev/fgj?successfully\n"); ?
  • ????retval=lseek(fd,5,0); ?
  • ????if(retval==-1) ?
  • ????{ ?
  • ????????perror("lseek?error\n"); ?
  • ????????exit(-1); ?
  • ????} ?
  • ????retval=read(fd,data,3); ?
  • ????if(retval==-1) ?
  • ????{ ?
  • ????????perror("read?error\n"); ?
  • ????????exit(-1); ?
  • ????} ?
  • ????data[retval]=0; ?
  • ????printf("read?successfully:%s\n",data); ?
  • ????//文件定位 ?
  • ????retval=lseek(fd,2,0); ?
  • ????if(retval==-1) ?
  • ????{ ?
  • ????????perror("lseek?error\n"); ?
  • ????????exit(-1); ?
  • ????} ?
  • ????retval=read(fd,data,3); ?
  • ????if(retval==-1) ?
  • ????{ ?
  • ????????perror("read?error\n"); ?
  • ????????exit(-1); ?
  • ????} ?
  • ????data[retval]=0; ?
  • ????printf("read?successfully:%s\n",data); ?
  • ????close(fd); ?
  • } ?
  • 本例運行結果如下:
  • [root@urbetter?/home]#?insmod?demo.ko ?
  • [root@urbetter?/home]#?mknod?/dev/fgj?c?224?0 ?
  • [root@urbetter?/home]#?./test ?
  • open?/dev/fgj?successfully ?
  • read?successfully:FGH ?
  • read?successfully:CDE ?
  • 總結

    以上是生活随笔為你收集整理的seek接口的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。