进程间通信之共享内存
共享內存是被多個進程共享的一部分物理內存。共享內存是進程間共享數據的一種最快的方法,一個進程向共享內存區域寫入了數據,共享這個內存區域的所有進程就可以立刻看到其中的內容。
共享內存實現分兩個步驟:
1、創建共享內存,使用shmget函數
2、映射共享內存,將這段創建的共享內存映射到具體的進程空間去,使用shmat函數。
創建:
int shmget(key_t key, int size, int shmflg) key: 1、0/IPC_PRIVATE:當key的取值為IPC_PRIVATE,則函數shmget()將創建一塊新的共享內存;如果key取值為0,而參數shmflg中又設置IPC_PRIVATE這個標志,則同樣會創建一塊新的共享內存。 2、大于0的32位整數:視參數shmflg來確定操作。size: 1、大于0的整數:新建的共享內存大小,以字節為單位0: 2、只獲取共享內存時指定為0shmflg:模式標志參數,使用時需要與IPC對象存取權限(如0600)進行|運算來確定共享內存的存取權限 1、0:取共享內存標識符,若不存在則函數會報錯 2、IPC_CREAT:當shmflg&IPC_CREAT為真時,如果內核中不存在鍵值與key相等的共享內存,則新建一個共享內存;如果存在這樣的共享內存,返回此共享內存的標識符 3、IPC_CREAT|IPC_EXCL:如果內核中不存在鍵值 與key相等的共享內存,則新建一個共享內存;如果存在這樣的共享內存則報錯返回值:如果成功,返回共享內存標識符;如果失敗,返回-1。映射:
void* shmat(int shmid, char *shmaddr, int flag) 參數: 第一個參數,shm_id是由shmget函數返回的共享內存標識。 第二個參數,shm_addr指定共享內存連接到當前進程中的地址位置,通常為空,表示讓系統來選擇共享內存的地址。 第三個參數,shm_flg是一組標志位,通常為0。返回值: 如果成功,則返回共享內存映射到進程中的地址;如果失敗,則返回-1。解除映射:
當一個進程不再需要共享內存時,需要把它從進程地址空間中脫離
參數shmaddr是shmat函數返回的地址指針,調用成功時返回0,失敗時返回-1.
該函數用于將共享內存從當前進程中分離。注意,將共享內存分離并不是刪除它,只是使該共享內存對當前進程不再可用。
共享內存控制:
int shmctl(int shm_id, int command, struct shmid_ds *buf);第一個參數,shm_id是shmget函數返回的共享內存標識符。
第二個參數,command是要采取的操作,它可以取下面的三個值 :
IPC_STAT:把shmid_ds結構中的數據設置為共享內存的當前關聯值,即用共享內存的當前關聯值覆蓋shmid_ds的值。
IPC_SET:如果進程有足夠的權限,就把共享內存的當前關聯值設置為shmid_ds結構中給出的值
IPC_RMID:刪除共享內存段
第三個參數,buf是一個結構指針,它指向共享內存模式和訪問權限的結構。
shmid_ds結構至少包括以下成員:
struct shmid_ds {uid_t shm_perm.uid;uid_t shm_perm.gid;mode_t shm_perm.mode; };創建程序A和程序B,一個寫入,一個打印
程序A:
程序B:
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <string.h>typedef struct _shm {int flag;char msg[256]; }SHM;int main() {// 1、創建或者獲取一個共享內存int shmid = shmget((key_t)1234, sizeof(SHM), 0666 | IPC_CREAT);if (shmid == -1){perror ("shmget");return -1;}sleep(10);// 2、將共享內存映射到當前的進程空間SHM* pshm = (SHM*)shmat(shmid, NULL, 0);if(pshm == (SHM*)-1){perror ("shmat");return -1;}printf ("%s\n", pshm->msg);return 0; }使用共享內存的優缺點:
1、優點:我們可以看到使用共享內存進行進程間的通信真的是非常方便,而且函數的接口也簡單,數據的共享還使進程間的數據不用傳送,而是直接訪問內存,也加快了程序的效率。同時,它也不像匿名管道那樣要求通信的進程有一定的父子關系。
2、缺點:共享內存沒有提供同步的機制,這使得我們在使用共享內存進行進程間通信時,往往要借助其他的手段來進行進程間的同步工作。
總結
以上是生活随笔為你收集整理的进程间通信之共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 r语言安装_R 和 RS
- 下一篇: 工具 转_微信文章转 PDF 桌面工具