Linux 下共享記憶體實現
阿新 • • 發佈:2018-12-09
c程式實現
寫記憶體
/*
* rShareM.c
*
* Created on: 2011-11-20
* Author: snape
*/
#include <stdio.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv) {
void say(int, char *);
int shmid;
int i = 0;
char *pshm;
char buf[1024];
//shmget第二個引數指定建立的共享記憶體的大小
say((shmid = shmget(1000, 1024 * 10, 0666 | IPC_CREAT)) < 0,
"create share memory");
//shmat for share memory attach
//第二個引數和第三個引數指定要對映得實體記憶體地址
//通常設為是 NULL 0 ,表示要對映得實體記憶體地址是程序空間得首地址
say((pshm = (char *) shmat(shmid, 0 , 0)) == NULL, "attch shm");
printf("input node 0-9\n");
scanf("%d", &i);
printf("node is %d\n", i);
memset(buf, 0, sizeof(buf));
printf("input data\n");
scanf("%s", buf);
memcpy(pshm + i * 1024, buf, 1024);
//取消對pshm實體地址得對映(程序結束系統會釋放共享記憶體對實體地址得對映) shmdt for share memory detach
//呼叫該函式,不會刪除共享記憶體物件,而是將該共享記憶體物件得連結數減1。
shmdt(pshm);
return 0;
}
void say(int flag, char *str) {
if (flag) {
fprintf(stderr, "[%s] error\n",str);
} else {
fprintf(stderr, "[%s] success\n",str);
}
}
讀記憶體
/*
* rShareM.c
*
* Created on: 2011-11-20
* Author: snape
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/shm.h>
int main(int argc, char **argv) {
void say(int, char *);
int i;
char *pshm;
char buf[1024];
int shmid;
say((shmid = shmget(1000, 10240, 0666 | IPC_CREAT)) < 0,
"create share memory");
say((pshm = (char *) shmat(shmid, 0, 0)) == NULL, "attach shm");
printf("input node 0-9\n");
scanf("%d", &i);
printf("node is %d\n",i);
memset(buf, 0, 1024);
memcpy(buf,pshm+i*1024,1024);
fprintf(stderr,"data [%s]\n",buf);
shmdt(pshm);
return 0;
}
void say(int flag, char *str) {
if (flag) {
fprintf(stderr, "[%s] error\n", str);
} else {
fprintf(stderr, "[%s] success\n", str);
}
}
執行結果
總結
- 主要用到三個函式
- (shmid = shmget(1000, 1024 * 10, 0666 | IPC_CREAT)) // 建立一個記憶體
- pshm = (char *) shmat(shmid, 0, 0) // 指標指向記憶體
- shmdt(pshm) // 指標接觸繫結
- 實際記憶體操作 “memcpy(pshm + i * 1024, buf, 1024); // 將buf 中的資料轉換到指定的記憶體區域”
- 讀寫的基本一致,主要是 memcpy() 一個是 buffer 讀到記憶體,一個是記憶體讀到buffer,
- 兩者指向同一個記憶體區域是 “pshm = (char *) shmat(shmid, 0, 0) // 指標都指向記憶體為(0,0)的區域”