linux 高級IO函數之fcntl mmap/munmap

fcntl函數提供了對文件描述符的各種控制操作。另外一個常見的控制文件描述符屬性和行爲的系統調用是ioctl,而且ioctl比fcntl能夠執行更多的控制。但是對於控制文件描述符常用的屬性和行爲,fcntl函數是由POSIX規範指定的首選方法,函數定義如下:

#include<fcntl.h>
int fcntl(int fd,int cmd,...)

fd參數是被操作的文件描述符,cmd參數指定執行何種類型的操作。根據操作類型的不同,該函數可能還需要第三個可選參數arg。fcntl函數支持的常用操作及其參數如下表所示:



fcntl函數成功時返回值如表所示,失敗則返回-1並設置errno。

在網絡編程中,fcntl函數通常用來將一個文件描述符設置爲非阻塞的,示例代碼如下:


此外,SIGIO和SIGURG這兩個信號與其他linux信號不同,它們必須與某個文件描述符相關聯方可使用:當被關聯的文件描述符可讀或可寫的時候,系統將出發SIGIO信號;當被關聯的文件描述符(而且必須是一個socket)上有帶外數據可讀的時候,系統將觸發SIGURG信號。將信號和文件描述符關聯的方法就是使用fcntl函數爲目標文件描述符指定宿主進程或進程組,那麼被指定的宿主進程或進程組將捕獲這兩個信號。使用SIGIO時,還需要利用fcntl設置O_ASYNC標誌(異步IO標誌,不過SIGIO信號模型並非真正意義上的異步IO模型)。


mmap函數用於申請一段內存空間。我們可以將這段內存作爲進程間通信的共享內存,也可以將文件直接映射其中。munmap函數則釋放有mmap創建的這段內存空間,它們的定義如下:

#include<sys/mman.h>
void* mmap(void*start,size_t length,int prot ,int flags, int fd,off_t offset);
int munmap(void* start size_t length);

start參數允許用戶使用某個特定的地址作爲這段內存的起始位置。如果它被設置爲NULL,則系統自動分配一個地址。

length參數指定內存段的長度。

proto參數用來設置內存段的訪問權限,它可以去以下幾個值的按位與:


flags參數控制內存段內容被修改後程序的行爲。它可以被設置爲圖6-1中的某些值(這裏僅僅列出了常用的值)的按位或(其中MAP_SHARED和MAP_PRIVATE是互斥的,不能同時指定)



發佈了211 篇原創文章 · 獲贊 514 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章