6 3linux程序間通訊之儲存對映

2021-10-06 04:37:15 字數 2280 閱讀 8774

title

date

comments

categories

br#linux程序間通訊之儲存對映

2020/3/9

true

linux

多程序

儲存對映

6.3

儲存對映i/o的本質是,把乙個磁碟上的檔案對映到核心緩衝區中。對磁碟檔案的讀寫,就相當於對核心緩衝區的讀寫。 這樣就可以不使用read和write,而是使用位址(也就是指標)來完成i/o操作。

使用這個函式通知核心,將乙個指定檔案對映到儲存區域中。這個對映工作可以通過mmap函式來實現。

void mmap(voidadrr, size_t length, int prot, int flags, int fd, off_t offset); 返回:成功:返回建立的對映區首位址;失敗:map_failed巨集 引數: addr: 建立對映區的首位址,由linux核心指定。使用時,直接傳遞null length: 欲建立對映區的大小 prot: 對映區許可權prot_read、prot_write、prot_read|prot_write flags: 標誌位引數(常用於設定更新物理區域、設定共享、建立匿名對映區) map_shared: 會將對映區所做的操作反映到物理裝置(磁碟)上。 map_private: 對映區所做的修改不會反映到物理裝置。 fd: 用來建立對映區的檔案描述符 offset: 對映檔案的偏移(4k的整數倍)

就像有malloc就有free,有new就有delete一樣,有mmap就有munmap,用來釋放掉磁碟檔案對緩衝區的對映。

int munmap(void *addr, size_t length); 成功:0; 失敗:-1

建立對映區的過程,隱含著一次對磁碟對映檔案的讀操作

當map_shared時,要求:對映區的許可權應 <=檔案開啟的許可權(出於對對映區的保護)。而map_private則無所謂,因為mmap中的許可權是對記憶體的限制。

對映區的釋放與檔案關閉無關。只要對映建立成功,檔案可以立即關閉。

特別注意,當對映檔案大小為0時,不能建立對映區。所以:用於對映的檔案必須要有實際大小!!mmap使用時常常會出現匯流排錯誤,通常是由於共享檔案儲存空間大小引起的。

munmap傳入的位址一定是mmap的返回位址。堅決杜絕指標++操作。

檔案偏移量必須為4k的整數倍

mmap建立對映區很容易出錯,所以一定要檢查返回值

linux作業系統(別的系統沒有)提供了匿名對映功能,無需依賴乙個磁碟檔案即可建立對映區,方法是把引數中的flag設定為map_anonymous或者map_anon

讀操作**

#include #include #include #include #include #include #include typedef struct _student

student;

int main(int argc, char *ar**)

//read data

while (1)

//close and munmap

munmap(stu, length);

close(fd);

return 0;

}

寫操作**

#include #include #include #include #include #include #include typedef struct _student

student;

int main(int argc, char *ar**)

// 1. open file

int fd = open(ar**[1], o_rdwr | o_creat | o_trunc, 0666);

int length = sizeof(student);

ftruncate(fd, length);

// 2. mmap

student *stu = mmap(null, length, prot_read | prot_write, map_shared, fd, 0);

if (stu == map_failed)

int num = 1;

// 3. 修改記憶體資料

while (1)

// 4. 釋放對映區和關閉檔案描述符

munmap(stu, length);

close(fd);

return 0;

}

linux程序間通訊之管道通訊

一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...

Linux中程序間通訊 共享儲存

今天同樣來看看程序間通訊,前面幾篇介紹了管道,訊號量,訊息佇列,這篇是共享記憶體。共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種ipc。使用共享儲存時要掌握的唯一竅門是多個程序之間對一給定儲存區的同步訪問。若伺服器程序正在將資料放入共享...

linux程序間通訊之管道

下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...