file_operations结构体
生活随笔
收集整理的這篇文章主要介紹了
file_operations结构体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下讀書筆記內容,摘自宋寶華《Linux設備驅動開發詳解》一書。
(1)llseek()函數
- 用來修改一個文件的當前讀寫位置,并將新位置返回,在出錯時,這個函數返回一個負值。
(2)read()函數
- 用來從設備中讀取數據,成功時函數返回讀取的字節數,出錯時返回一個負值。
- 它與用戶空間應用程序中的size_t read(int fd,void* buf,size_t count)和size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)。
- 向設備發送數據,成功時該函數返回寫入的字節數。如果此函數未被實現,當用戶進行 write()系統調用時,將得到-EINVAL 返回值。
- 它與用戶空間應用程序中的size_t write(int fd,const void* buf,size_t count)和size_t fwrite(……);
- 僅用于目錄,設備節點不需要實現它。
(5)ioctl()函數,即IO控制函數
- 提供設備相關控制命令的實現(既不是讀操作也不是寫操作),當調用成功時,返回給調用程序一個非負值。
- 內核本身識別部分控制命令,而不必調用設備驅動中的ioctl()。
- 如果設備不提供 ioctl()函數,對于內核不能識別的命令,用戶進行 ioctl()系統調用時將獲得-EINVAL 返回值。
- 它與用戶空間應用程序中的int fcntl(……)和int ioctl(……)
- 將設備內存映射到進程的內存中(即進程的虛擬地址空間中),如果設備驅動未實現此函數,用戶進行 mmap()系統調用時將獲得-ENODEV 返回值。
- 這個函數對于幀緩沖等設備特別有意義。幀緩沖被映射到用戶空間后,應用程序可以直接訪問它而無需在內核與應用間進行內存復制。
- 和用戶空間應用程序中的void* mmap(……)函數對應。
- 一般用于詢問設備是否可被非阻塞地立即讀寫。當詢問的條件未觸發時,用戶空間進行 select()和 poll()系統調用將引起進程的阻塞。
- 分別對與文件描述符對應的設備進行異步讀、寫操作。
- 設備實現這兩個函數后,用戶空間可以對該設備文件描述符調用 aio_read()、aio_write()等系統調用進行讀寫。
(9)open()函數
- 當用戶空間調用 Linux API 函數 open()打開設備文件時,設備驅動的 open()函數最終被調用。
- 驅動程序可以不實現這個函數,在這種情況下,設備的打開操作永遠成功。
- 與 open()函數對應的是 release()函數。
總結
以上是生活随笔為你收集整理的file_operations结构体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟HL-1118加粉清零
- 下一篇: vs code 小霸王插件本地nes游戏