1. 程式人生 > >Linux 下共享記憶體實現

Linux 下共享記憶體實現

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)的區域”