1. 程式人生 > 其它 >linux系統程式設計——實現共享記憶體

linux系統程式設計——實現共享記憶體

技術標籤:linuxc語言

linux系統程式設計——實現共享記憶體

一、相關的API
(1)shmget 建立或者獲取一個共享記憶體,成功返回共享記憶體ID,失敗返回-1。——建立共享記憶體
man手冊: man 2 shmget
key_t: 輸入 key就可以
size:共享記憶體的大小以兆對齊
flag:開啟佇列的方式,一般為IPC_CREAT在這裡插入圖片描述

(2)shmat 連線共享記憶體到當前程序的地址空間:成功返回指向共享記憶體的指標,失敗返回-1。——對映共享記憶體

man手冊:man 2 shmat
shmid:共享記憶體的id
第二個一般寫0,讓linux核心幫我們自動的安排共享記憶體

第三個一般也寫0,對映進來的共享記憶體是可讀可寫的
shmat作用:共享記憶體掛載到程序或者程式的儲存空間,在儲存空間中,定義一個變數,指向共享記憶體。在這裡插入圖片描述
0666可讀可寫的許可權

(3) shmdt 斷開與共享記憶體的連線:成功返回0,失敗返回-1。——釋放共享記憶體
man手冊:man 2 shmdt
在這裡插入圖片描述
按照第四行寫

(4)shmctl 控制共享記憶體的資訊,成功返回0,失敗返回-1。——幹掉共享記憶體
man手冊:man 2 shmctl
在這裡插入圖片描述
第一個是 id
第二個是指令
第三個一般寫0

二、程式碼實現

(1)共享記憶體——寫

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> //int shmget(key_t key, size_t size, int shmflg); int main() { int shmid; char *shmaddr; key_t key; key=ftok(".",1); shmid=shmget(key,1024*4,IPC_CREAT|0600); if
(shmid==-1) { printf("shmget no OK\n"); exit(-1); } shmaddr=shmat(shmid,0,0); printf("shmat ok\n"); strcpy(shmaddr,"bha hen shuai"); sleep(5);//睡眠5秒 shmdt(shmaddr); shmctl(shmid, IPC_RMID,0); printf("quit\n"); return 0; }

執行結果:
在這裡插入圖片描述

(2)共享記憶體——讀

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//int shmget(key_t key, size_t size, int shmflg);
int   main()
{
	   int  shmid;
	   char *shmaddr;

       key_t key;
	   key=ftok(".",1);

	  
	   shmid=shmget(key,1024*4,0);
         
       if(shmid==-1)
	   {
	         printf("shmget no OK\n");
		     exit(-1);
	   }

       shmaddr=shmat(shmid,0,0);

	   printf("shmat ok\n");
	   printf("data: %s\n",shmaddr);

	   
	   shmdt(shmaddr);
	  

	   printf("quit\n");
	   return 0;
}

執行結果:
在這裡插入圖片描述

——@上官可程式設計