文章目錄
- 前言
- 一、共享記憶體是什麼?
- 二、使用步驟
-
- 1.主函數調用
- 2.讀入資料
- 總結
前言
本篇主要是本小白對Linux 有名管道一些筆記,希望對一同學習Linux的夥伴有所幫助。
如有發現錯誤,歡迎指出,一同進步!
一、共享記憶體是什麼?
示例:共享記憶體能夠很容易控制容量,速度快,但要保持同步,比如一個程序在寫的時候,另一個程序要注意讀寫的問題,相當于線程中的線程安全,當然,共享記憶體區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一程序内的一塊記憶體。
二、使用步驟
1.主函數調用
主函數代碼如下:
#include <sys/shm.h>
// 建立或擷取一個共享記憶體:成功傳回共享記憶體ID,失敗傳回-1
int shmget(key_t key, size_t size, int flag);
// 連接配接共享記憶體到目前程序的位址空間:成功傳回指向共享記憶體的指針,失敗傳回-1
void *shmat(int shm_id, const void *addr, int flag);
// 形成映射:傳回值為位址,失敗傳回-1
int shmdt(void *addr);
// 斷開與共享記憶體的連接配接:成功傳回0,失敗傳回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf)
//銷毀該共享記憶體
(ipcs -m 檢視所有共享記憶體
ipcrm -m +共享記憶體id号 删除該共享記憶體)
2.讀入資料
代碼如下(示例):
必須使用 shmat 函數連接配接該共享記憶體到目前程序的位址空間,連接配接成功後把共享記憶體區對象映射到調用程序的位址空間,随後可像本地空間一樣通路。
//寫程式
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<stdio.h>
#include <sys/types.h>
//int shmget(key_t key, size_t size, int shmflg);
//void *shmat(int shmid, const void *shmaddr, int shmflg);
//int shmdt(const void *shmaddr);
//int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);
shmid = shmget(key,1024,IPC_CREAT|0666);
printf("the shmid = %d",shmid);
shmaddr = shmat(shmid,0,0);//第一個0為讓核心為我們賦空間
//第二個0代表映射進來的記憶體空間可讀可寫
strcpy(shmaddr,"hello gong xiang nei cun");
sleep(5);//睡眠5秒,讓讀程序讀走資料
shmdt(shmaddr);
shmctl(shmid,0,0);
return 0;
}
//讀程式
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<stdio.h>
#include <sys/types.h>
//int shmget(key_t key, size_t size, int shmflg);
//void *shmat(int shmid, const void *shmaddr, int shmflg);
//int shmdt(const void *shmaddr);
//int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);
shmid = shmget(key,1024,0);//寫程式已建立,是以這邊的直接指派0
printf("the shmid = %d",shmid);
shmaddr = shmat(shmid,0,0);
printf("the context is %s\n",shmaddr);
shmdt(shmaddr);
shmctl(shmid,0,0);
return 0;
}
總結
共享記憶體就是映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,建立一次即可,但多個程序都可以通路。