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