6.5. 移位一個(gè)設(shè)備

2018-02-24 15:49 更新

6.5.?移位一個(gè)設(shè)備

本章最后一個(gè)需要我們涉及的東西是 llseek 方法, 它有用(對(duì)于某些設(shè)備)并且容易實(shí)現(xiàn).

6.5.1.?llseek 實(shí)現(xiàn)

llseek 方法實(shí)現(xiàn)了 lseek 和 llseek 系統(tǒng)調(diào)用. 我們已經(jīng)說(shuō)了如果 llseek 方法從設(shè)備的操作中缺失, 內(nèi)核中的缺省的實(shí)現(xiàn)進(jìn)行移位通過(guò)修改 filp->f_pos, 這是文件中的當(dāng)前讀寫位置. 請(qǐng)注意對(duì)于 lseek 系統(tǒng)調(diào)用要正確工作, 讀和寫方法必須配合, 通過(guò)使用和更新它們收到的作為的參數(shù)的 offset 項(xiàng).

你可能需要提供你自己的方法, 如果移位操作對(duì)應(yīng)一個(gè)在設(shè)備上的物理操作. 一個(gè)簡(jiǎn)單的例子可在 scull 驅(qū)動(dòng)中找到:


loff_t scull_llseek(struct file *filp, loff_t off, int whence)
{
        struct scull_dev *dev = 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 = dev->size + off;
                break;

        default: /* can't happen */
                return -EINVAL;
        }
        if (newpos < 0)
                return -EINVAL;
        filp->f_pos = newpos;
        return newpos;
}

唯一設(shè)備特定的操作是從設(shè)備中獲取文件長(zhǎng)度. 在 scull 中 read 和 write 方法如需要地一樣協(xié)作, 如同在第 3 章所示.

盡管剛剛展示的這個(gè)實(shí)現(xiàn)對(duì) scull 有意義, 它處理一個(gè)被很好定義了的數(shù)據(jù)區(qū), 大部分設(shè)備提供了一個(gè)數(shù)據(jù)流而不是一個(gè)數(shù)據(jù)區(qū)(想想串口或者鍵盤), 并且移位這些設(shè)備沒(méi)有意義. 如果這就是你的設(shè)備的情況, 你不能只制止聲明 llseek 操作, 因?yàn)槿笔〉姆椒ㄔ试S移位. 相反, 你應(yīng)當(dāng)通知內(nèi)核你的設(shè)備不支持 llseek , 通過(guò)調(diào)用 nonseekable_open 在你的 open 方法中.


int nonseekable_open(struct inode *inode; struct file *filp); 

這個(gè)調(diào)用標(biāo)識(shí)了給定的 filp 為不可移位的; 內(nèi)核從不允許一個(gè) lseek 調(diào)用在這樣一個(gè)文件上成功. 通過(guò)用這樣的方式標(biāo)識(shí)這個(gè)文件, 你可確定不會(huì)有通過(guò) pread 和 pwrite 系統(tǒng)調(diào)用的方式來(lái)試圖移位這個(gè)文件.

完整起見, 你也應(yīng)該在你的 file_operations 結(jié)構(gòu)中設(shè)置 llseek 方法到一個(gè)特殊的幫忙函數(shù) no_llseek, 它定義在 <linux/fs.h>.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)