W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本章最后一個(gè)需要我們涉及的東西是 llseek 方法, 它有用(對(duì)于某些設(shè)備)并且容易實(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>.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: