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

12 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值