我正在创建共享内存段和信号量来锁定和解锁它们,并且在我的程序结束时它们不会被删除。我删除它们的代码如下
if ((shmdt(shared_memory)) == -1)
fprintf(stderr, "shmdt failed\n");
if ((shmctl(shmid, IPC_RMID, 0) )== -1)
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
和信号量
if((semctl(sid, 0, IPC_RMID, 0))==-1)
fprintf(stderr, "semctl(IPC_RMID) failed\n");
它们都没有进入 if 语句,这意味着它们不返回 -1
。
但是在我的终端中运行 ipcs
之后,它们仍然存在并带有正确的 key (我在代码中设置的 key )。
我还注意到 shmid
在创建并附加到共享内存段后立即为 0。这是为什么?除了删除 ipc 之外,我的代码中的一切都运行良好。
现在我知道要真正删除共享内存,所有附加到它的进程
必须分离。我在我的应用程序完成后立即运行 ps u
,它创建的所有子进程都没有运行,因此没有僵尸进程,它们在代码中的分离方式与父进程分离的方式相同。
所以我的问题是,这是怎么回事?为什么不删除?
最佳答案
请尝试使用 shmctl()
以 IPC_STAT
作为命令打印出 shmid_ds
结构。在执行 IPC_RMID
之前,您可以检查 shmid_ds
中的 shm_nattch
是否为 0
。如果不为0,则说明还有一些进程依附。
关于c - shmctl 和 semctl 不删除 ipc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26991062/