一些簡單的裝置驅動函式

2021-06-11 01:09:54 字數 4177 閱讀 5342

華清遠見嵌入式學院講師。

open()函式

功能: 開啟裝置檔案

原型: #include

#include

#include

int open(const char *pathname, int flag);

說明: 利用flags指定的屬性開啟表示pathname上指定字元的裝置檔案。通常,pathname上指定的位置為"/dev/"目錄中的裝置檔案。

變數: pathname 指定裝置檔案字元的位址

flags 指定接近裝置檔案的屬性:

_o_rdonly 以唯讀方式開啟檔案

_o_wronly 以只寫方式開啟檔案

_o_rdwr 以可讀可寫方式開啟檔案

_o_nocty 如果欲開啟的檔案為終端機裝置時,則不會將該終端機當成程序控制終端機

_o_nonblock 以不可阻斷的方式開啟檔案,也就是無論有無資料讀取或等待,都會立即返回程序之中

_o_ndelay 以不可阻斷的方式開啟檔案

_o_sync 以同步的方式開啟檔案,裝置上寫入的內容記錄到硬體之前,呼叫程序處於阻斷狀態

返回值: 若成功開啟檔案,則返回檔案描述符,失敗則返回-1值。若所有欲核查的許可權都通過了檢查則

返回0值,表示成功,只要有乙個許可權被禁止則返回-1。得到-1值時參考errno可以確定實際裝置驅動程式中返回的值。

close()函式

功能: 關閉裝置檔案

原型: #include

int close(int fd);

說明: 為了開啟裝置檔案,關閉open()函式返回的檔案描述符fd相應的裝置檔案。

變數: fd open()函式執行結果返回的檔案描述符

返回值: 成功關閉則返回0,失敗則返回-1。

read()函式

功能: 由裝置檔案讀取資料

原型: #include

ssize_t read(int fd, void *buf, size_t count);

說明: read()函式會把引數fd所指向的裝置檔案傳送count個位元組到buf指標所指的記憶體中。此時count 值應小於ssize_max。open()函式沒有指定為o_nonblock或o_ndelay時,阻斷到可讀取相應計數值的大小。裝置檔案的裝置驅動程式沒有體現o_nonblock或o_ndelay時,沒有指定相應的選項也有可能被阻斷。原則上這是錯誤的裝置驅動程式。建立程式時,也要對比上述情況,因此必須確認返回的結果。此外檔案讀寫位置會隨讀取大的位元組移動。

變數: fd 由open()函式執行結果返回的描述符

buf 儲存讀取資料的空間位置。該儲存空間應大於計數位元組

count 裝置檔案中讀取的資料大小。該值應小於ssize_max。返回值為0,立即終止執行

返回值: 裝置檔案正常讀取裡資料後,返回讀取的位元組數。即使該值小於相應的位元組數,也不是錯誤。幾乎沒有實際可用的位元組數或被中斷訊號時發生上述現象。如果失敗則返回-1,得到-1值時參考errno,可以確認實際裝置驅動程式中的返回值。

錯誤**:

-eintr 此呼叫被訊號所中斷

-eagain 當使用不可阻斷(o_nonblock)開啟檔案後,read呼叫無可讀取的資料

-eio 裝置檔案讀取資料是發生輸入輸出錯誤

-ebadf 引數fd非有效檔案描述符,或該檔案已關閉

-einval fd連線到不合適讀取的物件上

-efault 引數buf為無效指標,指向無法存在的空間

write()函式

功能: 將資料寫入裝置檔案內

原型: #include

ssize_t write(int fd, const void* buf, size_t count);

說明: write()函式會把引數buf所指的記憶體中的count個位元組寫入到引數fd所指的檔案內。此時count 值應小於ssize_max。open()函式沒有指定為o_nonblock或o_ndelay時,阻斷到可讀取相應count值的大小。裝置檔案的裝置驅動程式沒有體現o_nonblock或o_ndelay時,沒有指定相應的選項也有可能被阻斷。原則上這是錯誤的裝置驅動程式。建立程式時,也要對比上述情況,因此必須確認返回的結果。檔案指標的位置會隨之移動相應的位元組數。

變數: fd 由open()函式執行結果返回的描述符

buf 儲存寫入資料的空間位置。該位址所指的儲存空間應大於count位元組

count 裝置檔案中要寫入資料的大小。該值應小於ssize_max。返回值為0則立即中斷

返回值: 裝置檔案正常寫入資料後,返回寫入的位元組數。即使該值小於相應的必要位元組數,也不是錯誤。可能沒有寫入實際需要的位元組數,或被某種訊號中斷了。如果失敗則返回-1,得到-1值時參考errno,可以確認實際裝置驅動程式中的返回

錯誤**

-ebadf 引數fd非有效的檔案描述符,或該檔案沒有處於可寫狀態

-einval fd連線到不適合寫入的物件上

-efault 引數buf為無效指標,指向無法存在的空間

-eagain 雖然使用不可阻斷(o_nonblock)開啟了檔案,但是沒有處於read呼叫後可直接處理的狀態

-eintr 寫完資料前,此呼叫被訊號中斷

-enospc 包含fd檔案的裝置上不存在相應的資料空間

-eio 裝置檔案寫入資料的過程中發生了輸入輸出錯誤

lseek()函式

功能: 移動檔案的讀寫位置

原型: #include

#include

off_t lseek(int fd, off_t offset, int whence);

說明: lseek()函式用來控制該檔案的讀寫位置。把檔案描述符fd所指的裝置檔案向上移到檔案指標的位置把檔案指標的位置移到whence所指選項 offset值的位置上。檔案指標的位置隨裝置檔案所連線裝置驅動程式的處理方式而變化。例如,管理記憶體的裝置檔案可以利用記憶體的位置。但是,多數字元裝置驅動程式不使用該功能。

變數: fd 由open()函式執行結果返回的描述符offset 以位元組為單位,指定被移動檔案指標的位置。該值隨whence解釋為實際移動位置whence 指定用來解釋offset的條件

-seek_set 引數offset即為新的讀寫位置

-seek_cur 以目前的讀寫位置往後增加offset個位移量

-seek_end 將讀寫位置指向檔案尾後在增加offset個位移量。多數裝置為檔案的檔案尾定義較為模糊,通常不使用該值

返回值: 當呼叫成功時則返回目前的讀寫位置,也就是距離檔案開頭多少個位元組。若有錯誤則返回(off_t)-1,errno會存放錯誤**。得到了檔案指標的正常移動位置後,返回移到的實際位置。如果失敗則返回-1。得到-1值時參考全域性變數錯誤值,可以確定實際裝置驅動程式中返回的值

錯誤**

-einval whence指定的值不適合

ioctl()函式

功能: 控制裝置檔案

原型: #include

int ioctl(int fd, int request, ...);

說明: ioctl()函式在檔案描述符fd相應的裝置檔案上實現read()和write()函式難以完成的輸入輸出處理。該函式的各個變數中除fd外,其他變數沒有標準值。知識指定了幾個macro值定義的標準。不同的裝置檔案具有表示不同意義的值。ioctl()函式的各個變數時可變的。雖然在語法上能夠表現出來,但是最多可容納3個。第三個因素表示char *argp;

變數: fd 由open()函式執行結果返回的描述符request 定義連線裝置檔案的裝置驅動程式應呼叫的命令。根據巨集判斷是輸入命令還是輸出命令,argp指定的值作為儲存位址時,以位元組為單位顯示出傳達因子... 第三個變數被稱作argp,是可省略的變數,與request有關,是處理request命令的輔助資訊返回值: 當呼叫成功時返回0,失敗時-1。得到-1值時參考全域性變數錯誤值,可以確定實際裝置驅動程式中返回的值

錯誤**

-efault 引數argp無效,指向無法存在的記憶體空間

-enotty fd與字元裝置檔案無關

-einval 連線裝置檔案的裝置驅動程式不能處理request或者argp

推薦閱讀:

1.華清遠見企業學院免費講座:

2.3.

華清遠見嵌入式學院免費課堂:

4.華清遠見3g學院免費優惠:

5.華清遠見資料索取:

一些簡單的php函式

這幾天複習了php函式,溫故知新感覺加深了不少印象。下面就來介紹幾個在php中常用的函式吧。氣泡排序找最大值 function maopao a return max value php中的預設函式的使用 注 預設函式的形參智慧型寫在最右面 function def a,b false 可變引數列表...

一些簡單函式的運用

哈哈,最近學習到函式部分,下面一些簡單的小問題,我們試試來用函式的方法解決。1.輸出1 100之間的素數 include int main if j i return 0 上面是一般的方法,下面我們用函式的方法做 include include int number int i if j sqrt ...

一些函式的簡單實現

最近在牛客網刷了一些題,接下來給大家奉上我的一些函式的簡單實現,希望可以對大家有所幫助。也當作給自己做乙個簡單的筆記。const indexof arr,item arr.indexof item const sum arr arr.reduce prev,next prev next,0 cons...