• 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;
    }

  • 相关阅读:
    今天还要去一次北仑
    重归漫漫长路
    双休日,累
    调整心情,迎接新的挑战
    多喝点水,对身体有好处
    丈人生病住院了
    WPF,DataGrid数据绑定
    AXIS2简介
    心事一件件的了掉,希望一切都能恢复到正常
    驾车是种乐趣,也是种累
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6224091.html
Copyright © 2020-2023  润新知