免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4481 | 回复: 4

驱动学习过程中的疑问:read函数的参数loff_t * p是怎么回事? [复制链接]

论坛徽章:
0
发表于 2013-07-11 14:31 |显示全部楼层
linux驱动框架里的read函数原型是:ssize_t (*read) (struct file * filp, char __user * buffer, size_t    size , loff_t *  p);在这个函数里有个参数 loff_t *  p,表示读的位置相对于文件开头的偏移。但是我们在应用层的read函数为:size_t read(int fildes,const void *buf,size_t nbytes);里面没有参数 loff_t *  p。那么这个应用层read函数在调用驱动层read函数时,这个偏移量的值是多少?由什么决定?大家可以讨论下。

论坛徽章:
0
发表于 2013-07-11 14:37 |显示全部楼层
各路大神来帮小弟的忙啊。小弟先出去演小品了,等明天在来看回帖!

论坛徽章:
0
发表于 2013-07-11 15:50 |显示全部楼层
我想用这个系统调用时用到,还有个pwrite

ssize_t pread(int fd, void *buf, size_t count, off_t offset);
编辑本段用法返回值:成功,返回成功读取数据的字节数;失败,返回-1;
参数:  
(1) fd:要读取数据的文件描述符  
(2) buf:数据缓存区指针,存放读取出来的数据  
(3) count:读取数据的字节数  
(4) offset:读取的起始地址的偏移量,读取地址=文件开始+offset。注意,执行后,文件偏移指针不变

百度的例子:

#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void main()
{
int fd;
int count = 128;
int offset = 32;
int ret;
char buf[1024];
char pathname[128] = "/tmp/1.txt";
fd = open( pathname, O_RDONLY);
if((ret = pread(fd, buf, count, offset))=-1)
{
printf("pread error\n");
exit(1);
}
else
{
printf("pread success\n");
printf("the read data is:%s", buf);
}
}

论坛徽章:
0
发表于 2013-07-11 15:51 |显示全部楼层
回复 2# xifanlover
顺便问一下,你不会是赵本山吧!

   

论坛徽章:
0
发表于 2013-07-12 08:17 |显示全部楼层
回复 4# wwxxxxll


    谢谢大神解惑,你的解释很有道理,估计底层驱动read可以被好几个应用层的函数调用。pread估计也是调用read的。十分感谢。cu真是个好地方。我不是本山,哈哈。只是党支部有个节目而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP