定位设备--llseek实现

/**
如果llseek实现lseek和llseek系统调用,如果未定义llseek方法,
内核默认修改file结构体中的f_pos成员来实现定位,如果是操作一个
设备,则需提供自己的llseek方法。

不声明llseek方法默认是允许定位的,如果让设备不支持定位,则应在open方法中调用
nonseekable_open方法(/include/linux/fs.h)
int nonseekable_open(struct inode * inode, struct file * filp)
上述调用会把给定的filp标记为不可用,这样内核就不会让这种文件上的调用成功。
通过pread和pwrite系统调用也不能定位文件。

为完整起见,还应该将file_operations结构中的llseek方法设置为特殊的辅助
函数no_llseek,(/include/linux/fs.h)
*/

loff_t scull_llseek (struct file *filp, loff_t off, int whence)
{
    struct scull_cdev *cdev = filp->private_data;

    loff_t newpos;
    switch ( whence )
    {
        case 0: /*SEEK_SET*/
            newpos = off;
            break;

        case 1: /*SEEK_CUR*/
            newpos = filp->f_pos + off;
            break;

        case 2: /*SEEK_END*/
            newpos = cdev->size + off;
            break;

        default:
            return -EINVAL;
    }

    if (newpos < 0)
        return -EINVAL;

    filp->f_pos = newpos;
    return newpos;
}

你可能感兴趣的:(Linux字符驱动)