gpt4 book ai didi

c - shmctl 和 semctl 不删除 ipc

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:11 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com