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("請輸入操作!\n");
    char ch=getchar();
    if(ch=='1')
    {
        //將本進程中映射共享內存的內存塊釋放,本進程取消附加共享內存
        shmdt(buf);
        //刪除共享內存段
        shmctl(shmid,IPC_RMID,NULL);
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM