曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 8689|回复: 0
打印 上一主题 下一主题

不允许lseek文件 | nonseekable_open()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-3-9 11:14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内核:2.6.24


使用数据区时,可以使用 lseek 来往上往下地定位数据。但像串口或键盘一类设备,使用的是数据流,所以定位这些设备没有意义;在这种情况下,不能简单地不声明 llseek 操作,因为默认方法是允许定位的。

在 open 方法中调用 nonseekable_open() 时,它会通知内核设备不支持 llseek,nonseekable_open() 函数的实现定义在 fs/open.c 中:

[C++] 纯文本查看 复制代码
/*
 * This is used by subsystems that don't want seekable
 * file descriptors
 */
int nonseekable_open(struct inode *inode, struct file *filp)
{
    filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
    return 0;
}


当该函数调用后,如果再使用 lseek 操作时,那么内核会进行检查(fs/read_write.c):

[C++] 纯文本查看 复制代码
loff_t vfs_llseek(struct file *file, loff_t offset, int origin)
{
    loff_t (*fn)(struct file *, loff_t, int);


    fn = no_llseek;
    if (file->f_mode & FMODE_LSEEK) {   //检查是否可以 LSEEK
        fn = default_llseek;
        if (file->f_op && file->f_op->llseek)
            fn = file->f_op->llseek;
    }
    return fn(file, offset, origin);
}


上面,no_llseek() 函数定义为:

[C++] 纯文本查看 复制代码
loff_t no_llseek(struct file *file, loff_t offset, int origin)
{
    return -ESPIPE;
}


为了完整起见,如果不希望设备被 seek,还应该将 file_operations 结构中的 llseek 方法设置为特殊的辅助函数 no_llseek 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-11-1 07:53 , Processed in 0.059186 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表