日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程间通信之共享内存

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信之共享内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

共享內存是被多個進程共享的一部分物理內存。共享內存是進程間共享數據的一種最快的方法,一個進程向共享內存區域寫入了數據,共享這個內存區域的所有進程就可以立刻看到其中的內容。

共享內存實現分兩個步驟:
1、創建共享內存,使用shmget函數
2、映射共享內存,將這段創建的共享內存映射到具體的進程空間去,使用shmat函數。

創建

int shmget(key_t key, int size, int shmflg) key: 10/IPC_PRIVATE:當key的取值為IPC_PRIVATE,則函數shmget()將創建一塊新的共享內存;如果key取值為0,而參數shmflg中又設置IPC_PRIVATE這個標志,則同樣會創建一塊新的共享內存。 2、大于032位整數:視參數shmflg來確定操作。size: 1、大于0的整數:新建的共享內存大小,以字節為單位02、只獲取共享內存時指定為0shmflg:模式標志參數,使用時需要與IPC對象存取權限(如0600)進行|運算來確定共享內存的存取權限 10:取共享內存標識符,若不存在則函數會報錯 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。

解除映射
當一個進程不再需要共享內存時,需要把它從進程地址空間中脫離

int shmdt(char *shmaddr);

參數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:

#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;}// 2、將共享內存映射到當前的進程空間SHM* pshm = (SHM*)shmat(shmid, NULL, 0);if(pshm == (SHM*)-1){perror ("shmat");return -1;}strcpy (pshm->msg, "hello");// 解除共享內存映射,解除是值當前進程不能再使用共享內存shmdt(pshm);// 刪除共享內存//shmctl(shmid, IPC_RMID, NULL);return 0; }

程序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、缺點:共享內存沒有提供同步的機制,這使得我們在使用共享內存進行進程間通信時,往往要借助其他的手段來進行進程間的同步工作。

總結

以上是生活随笔為你收集整理的进程间通信之共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。