今天我們來談一談Linux行程間通信的方式之一共享記憶體
我們先來看看共享記憶體的定義:
共享記憶體,顧名思義就是允許兩個不相關的行程訪問同一個邏輯記憶體,共享記憶體是兩個正在運行的行程之間共享和傳遞資料的一種非常有效的方式,不同行程之間共享的記憶體通常為同一段物理記憶體,行程可以將同一段物理記憶體連接到他們自己的地址空間中,所有的行程都可以訪問共享記憶體中的地址,如果某個行程向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他行程,
怎么使用共享記憶體,有以下幾點步驟:
1.創建共享記憶體 shmget
2.映射到物理記憶體 shmat
3.資料讀寫
4.釋放共享記憶體shmdt
5.銷毀共享記憶體shmctl
介紹一下api:
1.shmget
原型:
int shmget(key_t key, size_t size, int shmflg);
示例:
shmget(key,1024*4,IPC_CREAT|0666);
2.shmat
原型:
void *shmat(int shmid, const void *shmaddr, int shmflg);
示例:
shmat(shmid,0,0);
最簡單的方法——讓系統自動安排共享記憶體
3.shmdt
原型
int shmdt(const void *shmaddr)
示例:
shmdt(shmaddr);
其中shmaddr=shmat(shmid,0,0);連接的共享記憶體的起始地址
4.shmctl
原型:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
示例:
shmctl(shmid,IPC_RMID,0);
接下來我們看看實際應用場景:
輸入端開辟共享記憶體并且映射,進行寫入,讀取端映射相同id號的共享記憶體,直接讀取(共享記憶體就像兩個人可以在同一張紙上寫字一樣,其中一個人寫了,你直接可以讀到)
編程示例:
輸入端:
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
shmid= shmget(key,1024*4,IPC_CREAT|0666);
if(shmid ==-1){
printf("shmeget error!\n");
exit(-1);
}
shmaddr =shmat(shmid,0,0);
printf("shmat complete\n");
strcpy(shmaddr,"made by chenkai");
sleep(5);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,0);
printf("quit!\n");
return 0;
讀取端:
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
shmid= shmget(key,1024*4,0);
if(shmid ==-1){
printf("shmeget error!\n");
exit(-1);
}
shmaddr =shmat(shmid,0,0);
printf("shmat complete\n");
printf("data:%s\n",shmaddr);
shmdt(shmaddr);
printf("quit!\n");
return 0;
}
輸入端寫入完畢,5秒后銷毀共享記憶體,如果讀取端未在5秒內讀取,則讀不到:

5秒內執行shmr可以讀到:
以上就是關于Linux行程間通信–共享記憶體的介紹,尚有不足之處,請各位大神指正,
salute CLC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/255586.html
標籤:區塊鏈
上一篇:44、backtrader的一些基本概念---Cheat-On-Open的使用方法
下一篇:fisco bcos目前發現每發起一筆交易就會生成一個區塊 ,怎么讓一個區塊里面包含多個交易,有地方可以設定嗎?還是要滿足什么要的條件?
