linux 程序之間 的通訊

2021-10-21 17:30:20 字數 1704 閱讀 2297

**在linux程序中有時需要程序之間相互的通訊

mmap 記憶體對映就是其中一種 ,通過建立檔案對映到磁碟,然後返回乙個指標,這樣就可以對磁碟進行讀取

mmap()系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以向訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。

採用共享記憶體通訊的乙個顯而易見的好處是效率高,因為程序可以直接讀寫記憶體,而不需要任何資料的拷貝。對於像管道和訊息佇列等通訊方式,則需要在核心和使用者空間進行四次的資料拷貝,而共享記憶體則只拷貝兩次資料[1]:一次從輸入檔案到共享記憶體區,另一次從共享記憶體區到輸出檔案。實際上,程序之間在共享記憶體時,並不總是讀寫少量資料後就解除對映,有新的通訊時,再重新建立共享記憶體區域。而是保持共享區域,直到通訊完畢為止,這樣,資料內容一直儲存在共享記憶體中,並沒有寫回檔案。共享記憶體中的內容往往是在解除對映時才寫回檔案的。因此,採用共享記憶體的通訊方式效率是非常高的**

void

*mmap

(void

*addr, size_t len,

int prot,

int flags,

int fd, off_t offset)

;引數length:代表將檔案中對映到記憶體的部分的長度。

引數prot:對映區域的保護方式。可以為以下幾種方式的組合:

prot_exec 對映區域可被執行

prot_read 對映區域可被讀取

prot_write 對映區域可被寫入

prot_none 對映區域不能訪問

引數flags:對映區的特性標誌位,常用的兩個選項是:

map_shard:寫入對映區的資料會複製回檔案,且執行其他對映檔案的程序共享

map_private:對對映區的寫入操作會產生乙個對映區的複製,對此區域的修改不會寫會原檔案

引數fd:要對映到記憶體中的檔案描述符,有open函式開啟檔案時返回的值。

引數offset:檔案對映的偏移量,通常設定為0,代表從檔案最前方開始對應,offset必須是分頁大小的整數倍。

#include

"string.h"

#include

"sys/mman.h"

#include

"stdlib.h"

#include

#include

#include

#include

"unistd.h"

intmain()

len=

ftruncate

(fd,4)

;//拓展檔案大小 檔案必須得有實際大小

p=mmap

(null,4

,prot_read|prot_write,map_shared,fd,0)

;//對映區的許可權應該小於 檔案開啟的許可權

if(p==map_failed)

//p++; 杜絕檔案指標本社的++ 但可以定義乙個 指標指向它 再操作

//否則在釋放時候會報錯

strcpy

(p,"abc");

munmap

(p,len)

;close

(fd)

;return0;

}

==父子程序之間獨享0到3g的記憶體 父子程序共享檔案描述符和mmap 對映區 ==

程序之間通訊

之所以開啟子程序 肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。然而程序記憶體是物理隔離的 1.將共享資料放在檔案中,就是慢 2.管道subprocess 中那個管道只能單向通訊,必須有父子關係 3.共享一塊記憶體區域 得作業系統幫你分配,速度快 from multiprocessi...

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...

程序之間的通訊 訊號通訊

訊號通訊 方式 訊號型別 下面是幾種常見的訊號 sighup 從終端上發出的結束訊號 sigint 來自鍵盤的中斷訊號 ctrl c sigkill 該訊號結束接收訊號的程序,殺死程序 sigterm kill 命令發出的訊號 sigchld 子程序停止或結束時通知父程序 sigstop 來自鍵盤 ...