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