llseek在manpage中的相关说明:名称 llseek - 重新定位读/写文件偏移量
函数原型
long long int _llseek(int fd,long long int offset,long long int whence)
说明
设置文件中进行读写的当前位置。该函数与C语言中的seek语句类似。如果用
open命令打开了一个文件,那么不要再对这个文件使用llseek函数
返回值
long long int,返回一个新位置,设置成从文件起始处算起的一个
偏移量。-1表示函数执行出错。会设置errno
参数表
参数说明
offset:字节偏移量
whence:下述常数之一
SEEK_SET将新位置指定成从文件起始处的一个偏移距离
SEEK_CUR将新位置指定成从当前位置开始的一个偏移距离
SEEK_END将新位置指定成从文件结尾开始的的一个偏移距离
注解
参考SetFilePointer函数,认识能对较大文件进行处理的一个近似函数
定位设备(llseek函数)
是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移位通过修改
,这是文件中的当前读写位置。对于lseek系统调用要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。如果设备是不允许移位的,你不能只制止声明llseek操作,因为缺省的方法允许移位。应当在你的open方法中,通过调用nonseekable_open通知内核你的设备不支持llseek:
实例代码
llseek方法实现了lseek和llseek系统调用.如果llseek方法从设备的操作中缺失, 内核中的缺省的实现通过修改
进行移位,这是文件中的当前读写位置. 请注意对于lseek系统调用要正确工作,读和写方法必须配合.
你可能需要提供你自己的方法, 如果移位操作对应一个在设备上的物理操作.一个简单的例子可在scull驱动中找到:
尽管刚刚展示的这个实现对scull有意义, 它处理一个被很好定义了的数据区, 大部分设备提供了一个数据流而不是一个数据区(串口或者键盘), 并且移位这些设备没有意义. 如果这就是你的设备的情况, 你不能只制止声明llseek操作, 因为缺省的方法允许移位. 相反, 你应当通知内核你的设备不支持llseek, 通过在你的 open 方法中调用nonseekable_open.
int nonseekable_open(struct inode *inode; struct file *filp);
这个调用标识了给定的filp为不可移位的;内核就不会允许一个lseek调用在这样一个文件上成功.通过用这样的方式标识这个文件,你可确定不会有通过pread和pwrite系统调用的方式来试图移位这个文件.
为了完整起见, 你也应该在你的file_operations结构中设置llseek方法到一个特殊的辅助函数no_llseek, 它定义在中.
对于scull字符设备驱动,添加了proc文件系统相关的操作,llseek及ioctl。
llseek
是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移
位通过修改
这是文件中的当前读写位置。对于
lseek
系统调用
要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。
如果设备是不允许移位的,
你不能只制止声明
llseek
操作,
因为缺省的方法允许移位。
应当在你的
open
方法中,
通过调用
nonseekable_open
通知内核你的
设备不支持
llseek:
llseek是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移位通过修改
这是文件中的当前读写位置。对于
lseek
系统调用
要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。
如果设备是不允许移位的,
你不能只制止声明
llseek
操作,
因为缺省的方法允
许移位。
应当在你的
open
方法中,
通过调用
nonseekable_open
通知内核你的
设备不支持
llseek
llseek
是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移位通过修改
这是文件中的当前读写位置。对于
lseek
系统调用
要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。
如果设备是不允许移位的,
你不能只制止声明
llseek
操作,
因为缺省的方法允
许移位。
应当在你的
open
方法中,
通过调用
nonseekable_open
通知内核你的
设备不支持
llseek
llseek
是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移
位通过修改
这是文件中的当前读写位置。对于
lseek
系统调用
要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。
如果设备是不允许移位的,
你不能只制止声明
llseek
操作,
因为缺省的方法允
许移位。
应当在你的
open
方法中,
通过调用
nonseekable_open
通知内核你的
设备不支持
llseek
llseek
是修改文件中的当前读写位置的系统调用,内核中的缺省的实现进行移
位通过修改
这是文件中的当前读写位置。对于
lseek
系统调用
要正确工作,读和写方法必须通过更新它们收到的偏移量来配合。
如果设备是不允许移位的,
你不能只制止声明
llseek
操作,
因为缺省的方法允
许移位。
应当在你的
open
方法中,
通过调用
nonseekable_open
通知内核你的
设备不支持
llseek