天天看點

Linux共享記憶體前言一、共享記憶體是什麼?二、使用步驟總結

文章目錄

  • 前言
  • 一、共享記憶體是什麼?
  • 二、使用步驟
    • 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;
}
           

總結

共享記憶體就是映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,建立一次即可,但多個程序都可以通路。

繼續閱讀