llseek

llseek

llseek在manpage中的相關說明:名稱 llseek - 重新定位讀/寫檔案偏移量

基本介紹

  • 中文名:修改檔案中的當前讀寫位置的系統調用
  • 外文名:llseek
  • 返回值:long long int
  • hFile Long:系統檔案句柄
  • lOffsetLong:位元組偏移量
函式原型,說明,返回值,參數表,註解,

函式原型

long long int _llseek(int fd,long long int offset,long long int whence)

說明

設定檔案中進行讀寫的當前位置。該函式與C語言中的seek語句類似。如果用open命令打開了一個檔案,那么不要再對這個檔案使用llseek函式

返回值

long long int,返回一個新位置,設定成從檔案起始處算起的一個偏移量。-1表示函式執行出錯。會設定errno

參數表

參數說明
fd:檔案描述符
offset:位元組偏移量
whence:下述常數之一
SEEK_SET將新位置指定成從檔案起始處的一個偏移距離
SEEK_CUR將新位置指定成從當前位置開始的一個偏移距離
SEEK_END將新位置指定成從檔案結尾開始的的一個偏移距離

註解

參考SetFilePointer函式,認識能對較大檔案進行處理的一個近似函式
定位設備(llseek函式)
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移位通過修改filp->f_pos,這是檔案中的當前讀寫位置。對於lseek系統調用要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。如果設備是不允許移位的,你不能只制止聲明llseek操作,因為預設的方法允許移位。應當在你的open方法中,通過調用nonseekable_open通知核心你的設備不支持llseek:
實例代碼
***************************************************@author:Jaguar.Yuan*@date:2010-8-7
*@describion:加入鎖機制的高級字元設備驅動,同時實現對llseek以及ioctl的測試,並通過使用module_param()實現對關鍵數據的自定義輸入。*@filename:scull2.c
***************************************************/#include<linux/kernel.h>#include<linux/module.h>#include<linux/fs.h>#include<linux/errno.h>#include<linux/sched.h>#include<linux/init.h>#include<linux/cdev.h>#include<asm/io.h>#include<asm/system.h>#include<asm/uaccess.h>#include"scull01.h"#defineSCULL2_SIZE0x1000/*定義全局記憶體最大4K位元組*/#defineMEM_CLEAR0X1/*清0全局記憶體*/
#defineSCULL2_MAJOR0/*定義為動態分配主設備號*/
staticintscull2_major=SCULL2_MAJOR;intscull2_minor=0;intscull2_nr_devs=SCULL_NR_DEVS;//設備數量intscull2_quantum=SCULL_QUANTUM;intscull2_qset=SCULL_QSET;/*scull2結構體定義*/structscull2_qset{void**data;structscull2_qset*next;};
structscull2_dev{structscull2_qset*data;/*指向quantumset*/intquantum;/*當前quantum大小*/intqset;/*當前結構中數組大小*/unsignedlongsize;/*存儲數據量大小*/unsignedintaccess_key;/*被sculluid和scullpriv調用*/structsemaphoresem;/*信號量聲明*/structcdevcdev;/*字元設備結構體*/};/*
structsemaphore{
spinlock_tlock;//自旋鎖類型unsignedintcount;//信號量計數
structlist_headwait_list;//雙向鍊表結構等待佇列,即當需要等待信號量時,調用進程把自己加入到等待佇列中,然後進入睡眠狀態.};*/
structscull2_dev*scull2_devices;//設備結構體指針//清空scull2設備內容;必須調用與信號設備。intscull2_trim(structscull2_dev*dev){
structscull2_qset*next,*dptr;//聲明兩個指針指向下一個和前一個字元設備結構
intqset=dev->qset;//dev不為nullinti;
//採用循環結構清空結構體中原有數據內容for(dptr=dev->data;dptr;dptr=next){if(dptr->data){
for(i=0;i<qset;i++)
kfree(dptr->data[i]);//依次對結構體中每個段清空kfree(dptr->data);//最後清除設備信息dptr->data=NULL;}
next=dptr->next;//指向設備中下一個字元設備kfree(dptr);//釋放當前設備}
//運用默認數據,初始化結構體中內容dev->size=0;
dev->quantum=scull2_quantum;dev->qset=scull2_qset;dev->data=NULL;return0;}
#ifdefSCULL_DEBUG//提供調試用的相關接口,僅需要在進行調試時被執行內容
llseek方法實現了lseek和llseek系統調用.如果llseek方法從設備的操作中缺失, 核心中的預設的實現通過修改filp->f_pos進行移位,這是檔案中的當前讀寫位置. 請注意對於lseek系統調用要正確工作,讀和寫方法必須配合.
你可能需要提供你自己的方法, 如果移位操作對應一個在設備上的物理操作.一個簡單的例子可在scull驅動中找到:
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;
}
儘管剛剛展示的這個實現對scull有意義, 它處理一個被很好定義了的數據區, 大部分設備提供了一個數據流而不是一個數據區(串口或者鍵盤), 並且移位這些設備沒有意義. 如果這就是你的設備的情況, 你不能只制止聲明llseek操作, 因為預設的方法允許移位. 相反, 你應當通知核心你的設備不支持llseek, 通過在你的 open 方法中調用nonseekable_open.
int nonseekable_open(struct inode *inode; struct file *filp);
這個調用標識了給定的filp為不可移位的;核心就不會允許一個lseek調用在這樣一個檔案上成功.通過用這樣的方式標識這個檔案,你可確定不會有通過pread和pwrite系統調用的方式來試圖移位這個檔案.
為了完整起見, 你也應該在你的file_operations結構中設定llseek方法到一個特殊的輔助函式no_llseek, 它定義在<linux/fs.h>中.
對於scull字元設備驅動,添加了proc檔案系統相關的操作,llseek及ioctl。
llseek
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移
位通過修改
filp->f_pos,
這是檔案中的當前讀寫位置。對於
lseek
系統調用
要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。
如果設備是不允許移位的,
你不能只制止聲明
llseek
操作,
因為預設的方法允
許移位。
應當在你的
open
方法中,
通過調用
nonseekable_open
通知核心你的
設備不支持
llseek:
llseek
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移
位通過修改
filp->f_pos,
這是檔案中的當前讀寫位置。對於
lseek
系統調用
要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。
如果設備是不允許移位的,
你不能只制止聲明
llseek
操作,
因為預設的方法允
許移位。
應當在你的
open
方法中,
通過調用
nonseekable_open
通知核心你的
設備不支持
llseek
llseek
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移
位通過修改
filp->f_pos,
這是檔案中的當前讀寫位置。對於
lseek
系統調用
要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。
如果設備是不允許移位的,
你不能只制止聲明
llseek
操作,
因為預設的方法允
許移位。
應當在你的
open
方法中,
通過調用
nonseekable_open
通知核心你的
設備不支持
llseek
llseek
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移
位通過修改
filp->f_pos,
這是檔案中的當前讀寫位置。對於
lseek
系統調用
要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。
如果設備是不允許移位的,
你不能只制止聲明
llseek
操作,
因為預設的方法允
許移位。
應當在你的
open
方法中,
通過調用
nonseekable_open
通知核心你的
設備不支持
llseek
llseek
是修改檔案中的當前讀寫位置的系統調用,核心中的預設的實現進行移
位通過修改
filp->f_pos,
這是檔案中的當前讀寫位置。對於
lseek
系統調用
要正確工作,讀和寫方法必須通過更新它們收到的偏移量來配合。
如果設備是不允許移位的,
你不能只制止聲明
llseek
操作,
因為預設的方法允
許移位。
應當在你的
open
方法中,
通過調用
nonseekable_open
通知核心你的
設備不支持
llseek

相關詞條

熱門詞條

聯絡我們