生活随笔
收集整理的這篇文章主要介紹了
seek接口
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
seek接口用來(lái)對(duì)設(shè)備的讀寫(xiě)位置進(jìn)行定位。file_operations結(jié)構(gòu)中對(duì)應(yīng)的seek接口如下:
loff_t?(*llseek)?(struct?file?*filp,?loff_t?off,?int?whence)?
其中off是偏移量,whence參數(shù)指起點(diǎn)位置。
例1.6? 字符設(shè)備seek實(shí)例
代碼見(jiàn)光盤(pán)\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; ?????//復(fù)制數(shù)據(jù)到指定的地址 ?????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, ?}; ?
應(yīng)用程序參考代碼如下:
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); ?} ?
本例運(yùn)行結(jié)果如下:
[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 ?
總結(jié)
以上是生活随笔為你收集整理的seek接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。