c - shmctl 和 semctl 不删除 ipc

标签 c linux shared-memory semaphore

我正在创建共享内存段和信号量来锁定和解锁它们,并且在我的程序结束时它们不会被删除。我删除它们的代码如下

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/

相关文章:

c - pelles c 的奇怪输出

python - GNOME:在备份运行时禁止关机

c - 如何在 argc 和 argv 中分配字符串

c - 为什么要使用 shm_open?

node.js - Node.js 中的共享内部内存池是什么

c++ - 如果对给定内存位置的写入发生在比页面粒度更细的位置,你能强制崩溃吗?

c - 结构填充和包装

c - 从 WinForms (GDI+) 迁移到 WPF 时如何替换 DrawClosedCurve/FillClosedCurve?

c - setuid 程序无法在 2.6 内核上运行

c - UNIX:退出时等待进程子进程?