定位設備--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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章