您的位置:首页 > 其它

UNIX 如果查询一个共享内存已经被IPCRM,程序中如何操作保证安全

2012-12-05 23:20 441 查看
进程内可以用根据ipc_perm的mode成员SHM_DEST位进行判断

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#include <stdio.h>

int main(void)
{
key_t key;
int id;
size_t size;
void *addr;
int ch;
struct shmid_ds buf;
unsigned int mode;

key = ftok("shm.key", 1);
size = 1024;
id = shmget(key, size, SHM_R | SHM_W | IPC_CREAT);
addr =  shmat(id, NULL, 0);

while ((ch = getchar()) != EOF) {
shmctl(id, IPC_STAT, &buf);
mode = buf.shm_perm.mode;
(void)printf("%o\n", (unsigned short)mode);
#ifdef SHM_DEST
if (SHM_DEST & mode)
(void)printf("%s\n", "destroy segment when # attached = 0");
#endif
}

shmdt(addr);
shmctl(id, IPC_RMID, NULL);

return 0;
}


运行ipcs -m查看共享内存,,此时status为空

ipcs -m

------ Shared Memory Segments --------

key shmid
owner perms bytes nattch status

0x00bc614e 32768 root 666 1024 1

删除shmid为32768的共享内存,此时status为dest,而key变为0x00000000

ipcrm -m 32768

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 32768 root 666
1024 1 dest

输入字符,屏幕输出

destroy segment when # attached = 0 因为我们手工删除了共享内存,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐