一、共享内存的实现方式:
1.System V的shmget(基本上所有linux都含有该接口,用法上系统V共享内存是以文件的形式组织在特殊文件系统shm中的。通过shmget可以创建或获得共享内存的标识符。取得共享内存标识符后,要通过shmat将这 个内存区映射到本进程的虚拟地址空间。)
2.posix的shm_open(缺点:通过ipcs查看不到,一些BSDs(OpenBSD and NetBSD IIRC)系统不支持,但相比shmget接口较新,且一般组合mmap使用)
3.posix的mmap
参考:
 
二、Linux辅助工具
ipcs:查看System V形式下的共享内存情况
ipcrm:移除共享内存
ps:具体参数解释请自行通过man查看
 
三、System V共享内存的简单示例:
共享内存的创建和删除:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>
#include <cstring>

using namespace std;

#define PATH_NAME "/tmp/shm_mark"

int main(int, char**)
{
    int fd;
    fd = open(PATH_NAME, O_CREAT, 0666);
    if(fd < 0)
    {
        cout << "open file" << PATH_NAME << "failed, with errno:" << strerror(errno) << endl;
        return -1;
    }
    close(fd);

    key_t key = ftok(PATH_NAME, 0);
    int shm_ref_id;
    shmid_ds shm_info;
    int ret = 0;

    shm_ref_id = shmget(key, sizeof(int), IPC_CREAT | 0666 | IPC_EXCL);
    if(shm_ref_id < 0 )
    {
        cout << "shmget failed.." << strerror(errno) << endl;
        return -1;
    }
    cout << "shmget id:" << shm_ref_id << endl;

//    char *shmaddr = (char*)shmat(shm_ref_id, NULL, 0);
//    shmdt(shmaddr);
    ret = shmctl(shm_ref_id, IPC_RMID, 0);//&shm_info);
    cout << "shmctl ret:" << ret << endl;
    if(ret < 0)
    {
        cout << "shmctl errno:" << errno << endl;
        return -1;
    }
    cout << "shm key:0x" << hex << key << dec << endl;
    cout << "shm id:" << shm_ref_id << endl;
    cout << "shm segsz:" << shm_info.shm_segsz << endl;
    cout << "shm nattch:" << shm_info.shm_nattch << endl;
    return 0;
}

0666:设置的是共享内存的权限。

IPC_CREAT:若发现没有对应的共享内存创建对应指定key_t类型ipc键的共享内存。

IPC_RMID:移除指定shm_id的共享内存。