// 讀管道
ssize_t read
(int fd,
void
*buf, size_t count)
;// 寫管道
ssize_t write
(int fd,
const
void
*buf, size_t count)
;
寫端關閉了
寫管道
讀端關閉了
有乙個磁碟檔案, 某個程序通過呼叫乙個函式mmap
可以在當前程序的虛擬位址空間中申請一塊記憶體, 將磁碟檔案中的內容對映到這塊記憶體中. 這塊記憶體就叫記憶體對映區
兩個程序通過記憶體對映區實現程序間通訊, 每個程序中都有一塊屬於自己的記憶體對映區
記憶體對映區, 需要乙個塊記憶體, 哪兒的記憶體?
建立記憶體對映區
#include
// 建立記憶體對映區
void
*mmap
(void
*addr, size_t length,
int prot,
int flags,
int fd, off_t offset)
;引數:
- addr: 要建立的記憶體對映區的起始位址,
null
-> 委託核心指定
- length: 要建立的記憶體對映區大小, 假設寫100
, 實際得到的是4k
- 這個長度實際是4k的整數倍
- 這個長度必須要大於0
- 如果引數指定為100
, 實際得到記憶體對映區4k, 剩餘3996會被填充為0
, 這部分資料是可以合理訪問的
- prot: 對記憶體對映區資料的操作許可權
- prot_exec: 對對映區資料有執行許可權
- prot_read:..
....
....
...讀許可權, 常用
- prot_write:..
....
....
..寫許可權, 常用
- prot_none:..
....
....
...沒有任何許可權
- flags: 對映區的屬性
- map_shared: 共享對映區, 如果是想程序間通訊必須要指定這個值
- map_private: 對映區是私有的, 不能實現程序間通訊
- fd: 通過開啟乙個磁碟檔案, 得到了這個檔案描述符, 這個磁碟檔案資料被對映到記憶體對映區
- offset: 進行對映的時候, 檔案的偏移量, 這個值必須是4k的整數倍, 不偏移指定為0
返回值:
成功: 得到建立的記憶體對映區的起始位址
失敗: map_failed [
(void*)
-1]
釋放記憶體對映區
// 釋放記憶體對映區
intmunmap
(void
*addr, size_t length)
;引數:
- addr: 要是釋放的記憶體對映區的起始位址, mmap的返回值
- length: 建立的記憶體對映區的大小, 和mmap的第二個引數值相等即可
返回值:
成功:0, 失敗:
-1
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...