Linux 共享内存详解一

共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,
会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除。只有当所有进程都调用shmdt,这个临时的不完整共享内存段才会消失。
//共享内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>

typedef struct _student
{
    char name[64];
    int index;
}Student;

int main()
{
    //创建内存中的共享内存区,大小是sizeof(Student),权限是0666
    int shmid= shmget(0x2234,sizeof(Student),0666|IPC_CREAT|IPC_EXCL);
    if(shmid==-1)
    {
        if(errno==EEXIST)
        {
            //该key值的共享内存已经存在
            shmid=shmget(0x2234,sizeof(Student),0666);
        }else
        {
            perror("shmget() err");
            return -1;
        }
    }
    //创建进程内的映射共享内存区
    void *buf=NULL;
    //shmat()第二个参数为NULL,表示由系统创建进程内的共享内存,第三个参数表示的是读写权限
    //返回值buf是系统在本进程内分配的内存块的首地址
    buf=shmat(shmid,NULL,0);
    //向本进程的共享内存写入数据
    strcpy(buf,"11112");
    printf("请输入操作!
");
    char ch=getchar();
    if(ch=='1')
    {
        //将本进程中映射共享内存的内存块释放,本进程取消附加共享内存
        shmdt(buf);
        //删除共享内存段
        shmctl(shmid,IPC_RMID,NULL);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/6224091.html