共享内存的使用c代码

typedef struct st_setting
{
    char agen[10];
    unsigned char file_no;
}st_setting_t;

int main(int argc, char** argv)
{
#define IPCKEY 0x366378
    int         shm_id;
    st_setting_t  *p_setting1, *p_setting2;

    /*首先检查共享内存是否存在,存在则先删除*/
    shm_id = shmget(IPCKEY , 1028, 0640);
    if(shm_id != -1)
    {
        p_setting1 = (st_setting_t *)shmat(shm_id, NULL, 0);

        if (p_setting1 != (void *)-1)
        {
            shmdt(p_setting1);

            shmctl(shm_id,IPC_RMID,0) ;
        }
    }

    /*建立共享内存*/
    shm_id = shmget(IPCKEY, 1028, 0640 | IPC_CREAT | IPC_EXCL);
    if(shm_id == -1)
    {
        printf("shmget error\n");
        return -1;
    }

    /*将这块共享内存区附加到本身的内存段*/
    p_setting1 = (st_setting_t *)shmat(shm_id, NULL, 0);

    strncpy(p_setting1->agen, "11111111", 10);
    printf("agen1 : %s\n", p_setting1->agen);

    p_setting1->file_no = 1;
    printf("file_no1 : %d\n",p_setting1->file_no);
    
    /*  此时可看到有进程关联到共享内存的信息,nattch为1*/
    system("ipcs -m");



    
    p_setting2 = (st_setting_t *)shmat(shm_id, NULL, 0);

    strncpy(p_setting2->agen, "2222", 10);
    printf("agen2 : %s\n", p_setting2->agen);

    p_setting2->file_no++;
    printf("file_no2 : %d\n",p_setting2->file_no);
    
    /*  此时可看到有进程关联到共享内存的信息,nattch为1*/
    system("ipcs -m");
    


    printf("agen1 : %s\n", p_setting1->agen);

    printf("file_no1 : %d\n",p_setting1->file_no);
    
    /*  此时可看到有进程关联到共享内存的信息,nattch为1*/
    system("ipcs -m");


    /*将这块共享内存区从本身的内存段删除出去*/
    if(shmdt(p_setting1) == -1)
       perror(" detach error ");

    if(shmdt(p_setting2) == -1)
       perror(" detach error ");

    /*此时可看到有进程关联到共享内存的信息,nattch为0*/
    system("ipcs -m");

    /*删除共享内存*/
    if (shmctl( shm_id , IPC_RMID , NULL ) == -1)
    {
        perror(" delete error ");
    }
    
    /* 此时可看到有进程关联到共享内存的信息,nattch为0*/
    system("ipcs -m");


    return EXIT_SUCCESS;
}
相关文章
相关标签/搜索