嵌入式linux的学习笔记-共享内存(六)
共享內存
共享內存是可以被多個進程共享訪問的一部分物理內存,如果多個進程都把一個內存區映射到自身的虛擬地址空間,則這些進程就可以直接訪問該共享的內存區域,從而通過共享內存的方式實現多進程間的通訊,共享內存是進程間數據通訊的最快方法.
共享內存的實現分為兩步:
1,創建共享內存,使用shmget函數
2,映射共享內存,將創建的共享內存映射到具體的進程空間中去,使用shmat函數
int shmget(key_t key,int size,int shmflg); //用于創建一個共享內存
共享內存對象的創建或獲得。與其它IPC機制一樣,進程在使用共享內存區域以前,必須通過系統調用sys_ipc (call值為SHMGET)創建一個鍵值為key的共享內存對象,或獲得已經存在的鍵值為key的某共享內存對象的引用標識符。以后對共享內存對象的訪 問都通過該引用標識符進行。對共享內存對象的創建或獲得由函數sys_shmget完成.這里key是表示該共享內存對象的鍵值,size是該共享內存區 域的大小(以字節為單位),shmflg是標志(對該共享內存對象的特殊要求)。
這里key是表示該共享內存對象的鍵值,size是該共享內存區域的大小(以字節為單位),shmflg是標志(對該共享內存對象的特殊要求)。
它所做的工作如下:
1) 如果key == IPC_PRIVATE,則總是會創建一個新的共享內存對象。
但是 (The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly show its function)
* 算出size要占用的頁數,檢查其合法性。
* 申請一塊內存用于建立shmid_kernel數據結構,注意這里申請的內存區域大小不包括真正的共享內存區,實際上,要等到第一個進程試圖訪問它的時候才真正創建共享內存區。
* 根據該共享內存區所占用的頁數,為其申請一塊空間用于建立頁表(每頁4個字節),將頁表清0。
* 搜索向量表shm_segs,為新創建的共享內存對象找一個空位置。
* 填寫shmid_kernel數據結構,將其加入到向量表shm_segs中為其找到的空位置。
* 返回該共享內存對象的引用標識符。
2) 在向量表shm_segs中查找鍵值為key的共享內存對象,結果有三:
* 如果沒有找到,而且在操作標志shmflg中沒有指明要創建新共享內存,則錯誤返回,否則創建一個新的共享內存對象。
* 如果找到了,但該次操作要求必須創建一個鍵值為key的新對象,那么錯誤返回。
* 否則,合法性、認證檢查,如有錯,則錯誤返回;否則,返回該內存對象的引用標識符。
共享內存對象的創建者可以控制對于這塊內存的訪問權限和它的key是公開還是私有。如果有足夠的權限,它也可以把共享內存鎖定在物理內存中。
void *shmat(int shmid,char *shmaddr(NULL),int shmflg); //用于將共享內存區域映射到本進程空間
int shmid是那塊共享內存的ID,也就是shmget的返回值
char *shmaddr是共享內存的起始地址
int shmflag是本進程對該內存的操作模式。如果是SHM_RDONLY的話,就是只讀模式。其它的是讀寫模式
成功時,這個函數返回共享內存的起始地址。失敗時返回-1
例子
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 2048
int main()
{
int shmid;????? //共享內存id號
char *shmadd;?? //創建本進程的共享內存映射空間
if((shmid=shmget(IPC_PRIVATE,BUFSIZE,0666))<0) //第一個參數固定,第二個參數是2k內存,第三個參數是可讀可寫
{
//創建共享內存失敗,出錯處理
}else
{
system("ipcs -m");????? //執行系統命令, ipcs -m 進程間通訊狀態 -m 活動的
printf("-----------------------------------\n");
}
shmaddr=shmat(shmid,NULL,0);??????? //將共享映射到本進程空間,并返回共享內存的地址
system("ipcs -m");????? //執行系統命令, ipcs -m 進程間通訊狀態 -m 活動的
printf("-----------------------------------\n");
shmadt(shmdt(shmaddr)); //斷開映射
system("ipcs -m");????? //執行系統命令, ipcs -m 進程間通訊狀態 -m 活動的
printf("-----------------------------------\n");
}
轉載于:https://www.cnblogs.com/flyxiang2010/archive/2010/12/17/1909107.html
總結
以上是生活随笔為你收集整理的嵌入式linux的学习笔记-共享内存(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware 15 上Mac虚拟机卡顿情
- 下一篇: linux下时间同步的两种方法分享