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

来源:互联网 发布:淘宝客如何取得代码 编辑:程序博客网 时间:2024/06/01 10:23

进程内可以用根据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   因为我们手工删除了共享内存,


原创粉丝点击