1. 程式人生 > >linux中file_operations結構體詳解

linux中file_operations結構體詳解

/**
 * author:hasen
 * 參考:《linux裝置驅動開發詳解》和sunsea1026的CSDN部落格
 * 作用:方便自己參考查閱
 */
struct file_operations{
	struct module *owner
	//第一個 file_operations 成員根本不是一個操作; 它是一個指向擁有這個結構的模組的指標. 這個成員用來在它的操作還在被使用時阻止模組被解除安裝. 幾乎所有時間中, 它被簡單初始化為 THIS_MODULE, 一個在 <linux/module.h> 中定義的巨集.

	loff_t (*llseek) (struct file *, loff_t, int);
	//llseek 方法用作改變檔案中的當前讀/寫位置, 並且新位置作為(正的)返回值. loff_t 引數是一個"long offset", 並且就算在 32位平臺上也至少 64 位寬. 錯誤由一個負返回值指示. 如果這個函式指標是 NULL, seek 呼叫會以潛在地無法預知的方式修改 file 結構中的位置計數器( 在"file 結構" 一節中描述).

	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	//用來從裝置中獲取資料. 在這個位置的一個空指標導致 read 系統呼叫以 -EINVAL("Invalid argument") 失敗. 一個非負返回值代表了成功讀取的位元組數( 返回值是一個 "signed size" 型別, 常常是目標平臺本地的整數型別).

	ssize_t (*aio_read)(struct kiocb *, char __user *, size_t, loff_t);
	//初始化一個非同步讀 -- 可能在函式返回前不結束的讀操作. 如果這個方法是 NULL, 所有的操作會由 read 代替進行(同步地).

	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	//傳送資料給裝置. 如果 NULL, -EINVAL 返回給呼叫 write 系統呼叫的程式. 如果非負, 返回值代表成功寫的位元組數.

	ssize_t (*aio_write)(struct kiocb *, const char __user *, size_t, loff_t *);
	//初始化裝置上的一個非同步寫.

	int (*readdir) (struct file *, void *, filldir_t);
	//對於裝置檔案這個成員應當為 NULL; 它用來讀取目錄, 並且僅對檔案系統有用.

	unsigned int (*poll) (struct file *, struct poll_table_struct *);
	//poll 方法是 3 個系統呼叫的後端: poll, epoll, 和 select, 都用作查詢對一個或多個檔案描述符的讀或寫是否會阻塞. poll 方法應當返回一個位掩碼指示是否非阻塞的讀或寫是可能的, 並且, 可能地, 提供給核心資訊用來使呼叫程序睡眠直到 I/O 變為可能. 如果一個驅動的 poll 方法為 NULL, 裝置假定為不阻塞地可讀可寫.

	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
	//ioctl 系統呼叫提供了發出裝置特定命令的方法(例如格式化軟盤的一個磁軌, 這不是讀也不是寫). 另外, 幾個 ioctl 命令被核心識別而不必引用 fops 表. 如果裝置不提供 ioctl 方法, 對於任何未事先定義的請求(-ENOTTY, "裝置無這樣的 ioctl"), 系統呼叫返回一個錯誤.

	int (*mmap) (struct file *, struct vm_area_struct *);
	//mmap 用來請求將裝置記憶體對映到程序的地址空間. 如果這個方法是 NULL, mmap 系統呼叫返回 -ENODEV.

	int (*open) (struct inode *, struct file *);
	//儘管這常常是對裝置檔案進行的第一個操作, 不要求驅動宣告一個對應的方法. 如果這個項是 NULL, 裝置開啟一直成功, 但是你的驅動不會得到通知.

	int (*flush) (struct file *);
	//flush 操作在程序關閉它的裝置檔案描述符的拷貝時呼叫; 它應當執行(並且等待)裝置的任何未完成的操作. 這個必須不要和使用者查詢請求的 fsync 操作混淆了. 當前, flush 在很少驅動中使用; SCSI 磁帶驅動使用它, 例如, 為確保所有寫的資料在裝置關閉前寫到磁帶上. 如果 flush 為 NULL, 核心簡單地忽略使用者應用程式的請求.

	int (*release) (struct inode *, struct file *);
	//在檔案結構被釋放時引用這個操作. 如同 open, release 可以為 NULL.

	int (*fsync) (struct file *, struct dentry *, int);
	//這個方法是 fsync 系統呼叫的後端, 使用者呼叫來重新整理任何掛著的資料. 如果這個指標是 NULL, 系統呼叫返回 -EINVAL.

	int (*aio_fsync)(struct kiocb *, int);
	//這是 fsync 方法的非同步版本.

	int (*fasync) (int, struct file *, int);
	//這個操作用來通知裝置它的 FASYNC 標誌的改變. 非同步通知是一個高階的主題, 在第 6 章中描述. 這個成員可以是NULL 如果驅動不支援非同步通知.

	int (*lock) (struct file *, int, struct file_lock *);
	//lock 方法用來實現檔案加鎖; 加鎖對常規檔案是必不可少的特性, 但是裝置驅動幾乎從不實現它.

	ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
	ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
	//這些方法實現發散/匯聚讀和寫操作. 應用程式偶爾需要做一個包含多個記憶體區的單個讀或寫操作; 這些系統呼叫允許它們這樣做而不必對資料進行額外拷貝. 如果這些函式指標為 NULL, read 和 write 方法被呼叫( 可能多於一次 ).

	ssize_t (*sendfile)(struct file *, loff_t *, size_t, read_actor_t, void *);
	//這個方法實現 sendfile 系統呼叫的讀, 使用最少的拷貝從一個檔案描述符搬移資料到另一個. 例如, 它被一個需要傳送檔案內容到一個網路連線的 web 伺服器使用. 裝置驅動常常使 sendfile 為 NULL.

	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
	//sendpage 是 sendfile 的另一半; 它由核心呼叫來發送資料, 一次一頁, 到對應的檔案. 裝置驅動實際上不實現 sendpage.

	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
	//這個方法的目的是在程序的地址空間找一個合適的位置來對映在底層裝置上的記憶體段中. 這個任務通常由記憶體管理程式碼進行; 這個方法存在為了使驅動能強制特殊裝置可能有的任何的對齊請求. 大部分驅動可以置這個方法為 NULL.[10]

	int (*check_flags)(int)
	//這個方法允許模組檢查傳遞給 fnctl(F_SETFL...) 呼叫的標誌.

	int (*dir_notify)(struct file *, unsigned long);
	//這個方法在應用程式使用 fcntl 來請求目錄改變通知時呼叫. 只對檔案系統有用; 驅動不需要實現 dir_notify.	
}

scull 裝置驅動只實現最重要的裝置方法. 它的 file_operations 結構是如下初始化的:

struct file_operations scull_fops = {
	.owner =  THIS_MODULE, 
	.llseek =  scull_llseek, 
	.read =  scull_read, 
	.write =  scull_write, 
	.ioctl =  scull_ioctl, 
	.open =  scull_open, 
	.release =  scull_release,  
};  

相關推薦

linuxfile_operations結構

/** * author:hasen * 參考:《linux裝置驅動開發詳解》和sunsea1026的CSDN部落格 * 作用:方便自己參考查閱 */ struct file_operations{ struct module *owner //第一個 file

Linux進程描述符task_struct結構--Linux進程的管理與調度(一)【轉】

mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體

Linux下DIR,dirent,stat等結構

最近在看Linux下檔案操作相關章節,遇到了這麼幾個結構體,被搞的暈乎乎的,今日有空,仔細研究了一下,受益匪淺。 首先說說DIR這一結構體,以下為DIR結構體的定義: struct __dirstream       {    void *__fd; 

結構

個數 初始化 例子 傳遞 其中 == 整形 註意 執行 1 概述  C語言允許用戶自己指定這樣一種數據結構,它由不同類型的數據組合成一個整體,以便引用,這些組合在一個整體中的數據是互相聯系的,這樣的數據結構稱為結構體,它相當於其它高級語言中記錄。  聲明一個結構休類型的一般

linuxFTP服務搭建--1.匿名與權限

一行 ext enforce 實驗環境 沒有 allow umask pda yar 實驗環境:在redhat6.5中安裝配置FTP服務,並使用一臺win7系統訪問驗證。理論:FTP連接方式 支持兩種連接模式:主動模式(Port)和被動模式(Pasv),這兩種模式

linuxFTP服務搭建--2.家目錄禁錮和黑白名單

ip 地址 問題 ges 添加 無法 sftp 分享圖片 deny ecb 操作環境 1 操作系統 : redhat 6.5 IP 地址 : 192.168.10.128 主機名 : zred2 操作系統:win 7 IP地址: 192.168.10

linuxFTP服務搭建--3.虛擬用戶

col spa 主機互聯 root tex linu oot guest 文件的 操作環境 1 操作系統 : redhat 6.5 IP 地址 : 192.168.10.128 主機名 : zred2 操作系統:win 7 IP地址: 192.16

linux 特殊符號用法

引號 zabbix 目錄 sele cond 特殊符號 zab set speed 星號(*) 當用於shell變量時, [root@zabbix_nuc ~]# sql=‘select * from mysql.user‘ [root@zabbix_nuc ~]# ech

C語言的結構(轉載只是為了查閱方便,若有侵權立刪)

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

linuxmount命令引數 nfs 引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux執行緒使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linuxmariadb基本用法(企業級)

資料庫 表的每一個列名字的頭   叫做欄位 是高階的exel表格軟體 資料庫種類 sqlserver  sqllite  db2   oracle  > mysql   比較多   其中my

tty驅動之tty_operations結構

struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx); //返回

C/C++結構

前面沒有typedef的,}後面的都是結構體變數,結構體變數陣列,結構體指標變數,都是變數。 有typedef的,}後面的都是型別,是可以拿來構建變數的。 typedef struct FreAarea//定義一個空閒區說明表結構 { long size; //分割槽大小 l

文章17 ngx_http_request_t結構

struct ngx_http_request_s {     uint32_t                          signature;         /* "HTTP" */ /* 與連線有關的內容 */     ngx_connection

linux sed的用法

sed 是操作,過濾和轉換文字內容的強大工具,sed可以從檔案和管道中讀取輸入。 sed 命令語法 sed [ option ] {sed -commands} {input -file} -e :執行多個sed命令 -n :只顯示操作行 -i

Linux的chmod指令

1. 許可權結構分解   chmod可以用來改變檔案的許可權,比如說讓我們來檢視test.txt的詳細資訊 ll test.txt   檢視的結構如下所示 -rw-r--r--. 1 root root 16 8月 18 17:06 test.txt

Linux的netstat命令

前面我們學習了網路的有關基礎知識,今天我們來介紹一個Linux下面的關於網路的一個重要指令——netstat. 功能說明 netstat是基於Netstat這個命令列工具的指令,它可以用來查詢系統上的網路套接字連線情況,包括tcp,udp以及Unix

struct net_device網路裝置結構

在linux中使用struct net_device結構體來描述每一個網路裝置。同時這個用來刻畫網路裝置的struct net_device結構體包含的欄位非常的多,以至於核心的開發者都覺得在現在的linux核心中,這個struct net_device是一個大

Linux樹狀結構檔案

Linux樹狀檔案詳解 /           根目錄 /bin        存放使用者可執行程式 /boot       存放系統啟動時所需檔案、核心檔案 /dev