linux 高级IO函数之fcntl mmap/munmap
fcntl函數(shù)提供了對文件描述符的各種控制操作。另外一個(gè)常見的控制文件描述符屬性和行為的系統(tǒng)調(diào)用是ioctl,而且ioctl比fcntl能夠執(zhí)行更多的控制。但是對于控制文件描述符常用的屬性和行為,fcntl函數(shù)是由POSIX規(guī)范指定的首選方法,函數(shù)定義如下:
#include<fcntl.h> int fcntl(int fd,int cmd,...)fd參數(shù)是被操作的文件描述符,cmd參數(shù)指定執(zhí)行何種類型的操作。根據(jù)操作類型的不同,該函數(shù)可能還需要第三個(gè)可選參數(shù)arg。fcntl函數(shù)支持的常用操作及其參數(shù)如下表所示:
fcntl函數(shù)成功時(shí)返回值如表所示,失敗則返回-1并設(shè)置errno。
在網(wǎng)絡(luò)編程中,fcntl函數(shù)通常用來將一個(gè)文件描述符設(shè)置為非阻塞的,示例代碼如下:
此外,SIGIO和SIGURG這兩個(gè)信號與其他linux信號不同,它們必須與某個(gè)文件描述符相關(guān)聯(lián)方可使用:當(dāng)被關(guān)聯(lián)的文件描述符可讀或可寫的時(shí)候,系統(tǒng)將出發(fā)SIGIO信號;當(dāng)被關(guān)聯(lián)的文件描述符(而且必須是一個(gè)socket)上有帶外數(shù)據(jù)可讀的時(shí)候,系統(tǒng)將觸發(fā)SIGURG信號。將信號和文件描述符關(guān)聯(lián)的方法就是使用fcntl函數(shù)為目標(biāo)文件描述符指定宿主進(jìn)程或進(jìn)程組,那么被指定的宿主進(jìn)程或進(jìn)程組將捕獲這兩個(gè)信號。使用SIGIO時(shí),還需要利用fcntl設(shè)置O_ASYNC標(biāo)志(異步IO標(biāo)志,不過SIGIO信號模型并非真正意義上的異步IO模型)。
mmap函數(shù)用于申請一段內(nèi)存空間。我們可以將這段內(nèi)存作為進(jìn)程間通信的共享內(nèi)存,也可以將文件直接映射其中。munmap函數(shù)則釋放有mmap創(chuàng)建的這段內(nèi)存空間,它們的定義如下:
#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參數(shù)允許用戶使用某個(gè)特定的地址作為這段內(nèi)存的起始位置。如果它被設(shè)置為NULL,則系統(tǒng)自動分配一個(gè)地址。
length參數(shù)指定內(nèi)存段的長度。
proto參數(shù)用來設(shè)置內(nèi)存段的訪問權(quán)限,它可以去以下幾個(gè)值的按位與:
flags參數(shù)控制內(nèi)存段內(nèi)容被修改后程序的行為。它可以被設(shè)置為圖6-1中的某些值(這里僅僅列出了常用的值)的按位或(其中MAP_SHARED和MAP_PRIVATE是互斥的,不能同時(shí)指定)
總結(jié)
以上是生活随笔為你收集整理的linux 高级IO函数之fcntl mmap/munmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: httplib用法
- 下一篇: 推动Windows的限制:USER和GD