1. 程式人生 > >Linux---程序間通訊IPC之共享記憶體

Linux---程序間通訊IPC之共享記憶體

程序間通訊(IPC):是指在不同程序之間傳播或交換資訊。
IPC的方式:通常有管道(無名管道、命名管道)、訊息佇列、訊號量、共享儲存、Socket、Streams等(Socket和Streams支援不同主機上的兩個程序IPC)
程序間通訊的目的:
1.資料傳輸:一個程序需要將它的資料發給另一個程序
2.資源共享:多個程序之間共享同樣的資源
3.通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它(它們)傳送了啥(如程序終止要通知父程序)
4.程序控制:有些程序希望完全控制另一個程序的執行(如Debug程序),此時控制程序希望能夠攔截另一個程序的所有陷入和異常,並能夠及時知道它的狀態改變

共享記憶體
共享記憶體就是允許兩個或者多個程序共享一定的儲存區,當一個程序改變了這塊地址中的內容的時候,其他程序都會知道這個更改,因為資料直接寫到記憶體中,不用多次複製,所以這是最快的程序間通訊
這裡寫圖片描述
共享記憶體沒有同步互斥機制,在程式設計中應注意程序訪問的同步問題,一般配合著訊號量來實現共享記憶體的同步互斥
建立共享記憶體

#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);

-key,共享記憶體的鍵值,與訊息佇列類似,可以由使用者指定,也可以通過ftok函式生成,如果設定為IPC_RPIVATE
,表示總是建立新的共享記憶體
-size,共享記憶體的大小,如果正在建立一塊共享記憶體,必須設定此引數,如果正在開啟一塊已經存在的共享記憶體,可以將此引數設為0 -shmflg,建立共享記憶體時設定其存取許可權 -返回值,函式執行成功後,返回共享記憶體的識別符號,否則返回-1

控制共享記憶體

#include<sys/ipc.h>
#include<sys/shm.h>
struct shmid_ds
{
    uid_t shm_perm.uid;
    uid_t shm_perm.gid;
    mode_t shm_perm.mode;
};
int shmctl(int
shm_id,int command,struct shmid_ds *buf); -shmid,是shmget函式返回的共享記憶體識別符號 -command,要採取的操作 IPC_STAT,把shmid_ds結構中的資料設定為共享記憶體的當前關聯值 IPC_SET,如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中值 IPC_RMID,刪除共享記憶體段 -buf,結構指標,指向共享記憶體模式和許可權的結構

共享記憶體的讀寫
第一次建立共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的地址空間

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
void* shmat(int shm_id,const void* shm_addr,int shmflg);

-shm_id,shmget函式返回的共享記憶體標識
-shm_addr,指定共享記憶體連線到當前程序中的地址位置,通常為空,表示讓系統來選擇共享記憶體的地址
-shmflg,用來設定共享記憶體的訪問許可權,如果要求以只讀方式訪問,則是SHM_RDONLY
-返回值,成功時返回指向共享記憶體第一個位元組的指標,失敗時返回-1

shmdt函式用於將共享記憶體從當前程序中分離,將共享記憶體分離並不是刪除它,只是使共享記憶體對當前程序不再可用。當一個程序終止時,它所對映的共享記憶體都會自動分離

#include<sys/ipc.h>
#include<sys/shm.h>
int shmdt(const void* shmaddr);

-shmaddr,shmat函式返回的地址
-返回值,成功時返回0,失敗時返回-1

如果有什麼不對的地方,可以評論告訴我,望指導!