- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建共享内存段和信号量来锁定和解锁它们,并且在我的程序结束时它们不会被删除。我删除它们的代码如下
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/
我正在尝试创建一个具有同步功能的程序,但我遇到了一个问题,即我正在创建一组大小值为 3 的信号量。 当尝试执行 semctl 将信号量的值设置为 0 时,我得到的数值结果超出了 strerror 范围
我正在为我的大学做一个项目,所以我不能使用 semaphore.h 库。 我想做的是将一个信号量初始化为一个值 MAX_ACCESS(默认为 10),如果该信号量可用,则执行操作。 semId = s
在共享库中调用 semctl() 函数时,有一些令人担忧的地方。 IPC_STAT 命令返回的值不正确。准确地说是 uid、gid 和 mode 字段。从独立程序调用该函数时没有问题。在这种情况下,所
我正在创建共享内存段和信号量来锁定和解锁它们,并且在我的程序结束时它们不会被删除。我删除它们的代码如下 if ((shmdt(shared_memory)) == -1) fprintf(s
这是我第一次尝试信号量和线程。我根据在网上找到的示例和手册页构建了这段代码。我对这段代码有两个疑问。 为什么每当我尝试 semctl 时都会出现总线错误(我知道这是问题的根源,因为调试行 3 没有打印
为什么信号量的 System V 实现中函数 semctl 的第四个参数是可选的,即 union semun,因为我发现有必要通过信号量的 val 或数组成员来初始化信号量的值。是否存在任何其他方式,
我正在研究 Beej's Guide to Unix IPC 中的信号量示例程序. 示例程序包含以下信号量初始化代码。我只是从中发布与问题相关的片段。要查看完整代码,请访问我在上面提供的链接。 /*
我是一名优秀的程序员,十分优秀!