檔案IO程式設計六

2021-07-31 20:49:26 字數 1436 閱讀 3424

這一節繼續講解系統io函式

(1) dup

標頭檔案:#include

定義函式:int dup (int oldfd);

說明:dup()用來複製引數oldfd所指向的檔案描述符,此時返回的新的檔案描述符和引數oldfd所指的是同乙個檔案,共享所有的鎖定、讀寫位置和各項許可權或旗標。例如,當利用lseek()對某個檔案描述符作用時,另乙個檔案描述符的讀寫位置也會隨著改變。

(2) dup2

標頭檔案:#include

定義函式:int dup2(int odlfd, int newfd);

說明:dup2()用來複製引數oldfd所指向的檔案描述符,並將它拷貝到引數newfd後一塊返回。若引數newfd為一已開啟的檔案描述符,則newfd所指的檔案會先被關閉,dup2()所複製的檔案描述符,與原來的檔案描述符共享各種檔案狀態。

兩者的區別是dup()只能生成乙個未開啟的最新的檔案描述符,而dup2()可以隨意重定向。

(2) fcntl

定義函式:

int fcntl(int fd, int cmd, … /* arg */ );

說明:fcntl其實就是對開啟的檔案描述符進行一系列的控制操作。每乙個開啟的檔案都有很多屬性,比如檔案描述符的標誌(目前只有fd_cloexec乙個標誌)、檔案的狀態(o_creat、o_excl、o_noctty、o_trunc)。

fcntl的主要功能:

程式 :

int flag_val = fcntl(fd, f_getfl);      //獲取fd的檔案屬性

flag_val |= o_nonblock;              //追加檔案屬性

fcntl(fd, f_setfl, flag_val);              //設定檔案屬性

(3) ioctl

定義函式:int ioctl(int d, unsigned long request, …);

說明:ioctl是對裝置(檔案)的控制操作。我們已經提過了對一些檔案(裝置)的通用操作,但是每乙個裝置肯定有一些不同於其他裝置的功能或者屬性。比如網路介面裝置有ip、mask等屬性或者終端裝置有波特率等。

那麼對裝置的不同屬性我們提供了乙個「收納盒」ioctl,因為每乙個裝置的特性都是不同的,所以不可能有乙個統一的命令,而我們也不可能在kernel提供ioctl的具體實現,所以是由每個裝置的驅動程式提供裝置支援的ioctl功能命令集合。

在fcntl的man手冊中列出了支援的所有cmd命令,但是在ioctl的man手冊中沒有列出支援的命令,這是因為ioctl是每乙個裝置自身的實現來支援的。系統本身對一些常見的裝置會提供一些ioctl支援,定義在系統標頭檔案中。除了這些常見的裝置以外,其他的裝置的ioctl的支援都需要自己在驅動中編寫。

檔案I O程式設計

linux的輸入 輸出 i o 操作,通常分為 個方面 開啟 讀取 寫入 定位和關閉 對應的有 個系統呼叫 open read write lseek 和close 這 個函式,也稱為不帶緩衝區的i o操作。程式設計師可以直接操作硬體,這樣為開發驅動等底層的系統應用提供了方便。這些函式屬於posix...

linux 檔案I O 程式設計

1.基本操作 include include include open fd open tmp hello.c o wronly o creat,0600 close close fd read read fd,buf,len write write fd,buf,len lseek off t l...

檔案IO程式設計二

上一章主要是講了檔案系統以及整個操作的流程,這一講主要是講vfs虛擬檔案系統 引言 linux中允許眾多不同的檔案系統共存,如ext2,ext3,vfat等。通過使用同一套檔案i o系統呼叫即可對linux中的任意檔案進行操作而無需考慮檔案系統格式。對檔案的操作也可以跨檔案系統而執行。我們可以使用c...