進程間通信 之 共享內存(Linux)

共享內存

共享內存是被多個進程共享的一部分物理內存.共享內存是進程間共享數據的一種最快的方法,一個進程向共享內存區域寫入了數據,共享這個內存區域的所有進程就可以立刻看到其中的內容。
這裏寫圖片描述

實現共享內存的步驟

共享內存實現分爲兩個步驟:
一、創建共享內存,使用shmget函數;
二、映射共享內存,將這段創建的共享內存映射到具體的進程空間去,使用shmat函數。

創建

int shmget ( key_t key, int size, int shmflg )

  key標識共享內存的鍵值: 0/IPC_PRIVATE。 當key的取值爲IPC_PRIVATE,則函數shmget()將創建一塊新的共享內存;如果key的取值爲0,而參數shmflg中又設置IPC_PRIVATE這個標誌,則同樣會創建一塊新的共享內存。
  返回值:如果成功,返回共享內存標識符;如果失敗,返回-1。

這裏寫圖片描述

映射

char * shmat ( int shmid, char *shmaddr, int flag)

參數:
    shmid:shmget函數返回的共享存儲標識符
    flag:決定以什麼方式來確定映射的地址(通常爲0)
返回值:
    如果成功,則返回共享內存映射到進程中的地址;如果失敗,則返回- 1

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

脫離

 當一個進程不再需要共享內存時,需要把它從進程地址空間中脫離。
    int shmdt ( char *shmaddr )

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

小程序

write.c

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

int main()
{
    int shmid = shmget((key_t)1234, 100, IPC_CREAT);
    if (-1 == shmid)
    {
        perror("shmget");
        exit(1);
    }

    char *ptr = (char *)shmat(shmid, NULL, 0);
    if ((void *)-1 == ptr)
    {
        perror("shmat");
        exit(2);
    }
    memset(ptr, 0, 100);

    char *str = "hello";
    //memcpy(ptr, str, strlen(str));

    if (-1 == shmdt(ptr))
    {
        perror("shmdt");
        exit(3);
    }

    return 0;
}

read.c

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

int main()
{
    int shmid = shmget((key_t)1234, 100, IPC_CREAT);
    if (-1 == shmid)
    {
        perror("shmget");
        exit(1);
    }

    char *ptr = (char *)shmat(shmid, NULL, 0);
    if ((void *)-1 == ptr)
    {
        perror("shmat");
        exit(2);
    }

    char buffer[100] = {0};
    memcpy(buffer, ptr, 100);
    printf("%s\n", buffer);

    if (-1 == shmdt(ptr))
    {
        perror("shmdt");
        exit(3);
    }

    return 0;
}
發佈了54 篇原創文章 · 獲贊 58 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章