共享内存及创建步骤

发布于:2023-01-02 ⋅ 阅读:(379) ⋅ 点赞:(0)

        共享内存是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗。

        共享内存是将用户空间的虚拟内存映射到内核空间的物理内存。(不需要拷贝write,read)

共享内存头文件:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

 共享内存的使用包括如下步骤

1、创建/打开共享内存。

//创建并打开共享内存
    key_t key = ftok(".", 10);//找到write的key.
    if(key < 0)
    {
        perror("ftok error!");
        return -1;
    }
    printf("key = %d\n", key);
    int shmId = shmget(key, 100, 0666 | IPC_CREAT);
    if(shmId < 0)
    {
        perror("shmget error!");
        return -1;
    }

2、映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。

void *p = shmat(shmId, NULL, 0);
    if((void *)-1 == p)
    {
        perror("shmat error!");
        shmctl(shmId, IPC_RMID, NULL);    //删除共享内存
        return 0;
    }

3、撤销共享内存映射。

shmdt(p);

4、删除共享内存对象。

shmctl(shmId, IPC_RMID, NULL);

以下为程序: