c - 在删除之前从共享内存中分离

标签 c linux sysv-ipc

当我有多个进程在使用共享内存时,我会分离所有进程,只留下一个。

  1. 在使用 shmctl() 删除共享内存之前分离最后一个进程是否有意义? (用那个过程)?
  2. 如果没有意义,是否可以可以在从共享内存分离后删除共享内存?

最佳答案

shmctl() 的手动输入没有说“最多一个进程使用它”或“没有附加到它的进程”。但是,系统无法完全中断已连接到共享内存段的正在运行的进程。

您只需要shmget() 返回的shmid(共享内存段ID) ;您不需要附加共享内存(因此您可能已经运行了 shmdt() )。

在 Mac(macOS Sierra 10.12.3,GCC 6.3.0)上使用来自上一个问题(Making a shared data structure in C)的代码进行测试,我添加了一个选项 -t time 来完成这个过程 sleep 一段指定的时间。然后我创建了一个共享内存段并让进程保持打开状态。我使用 ipcs -m 查看该段是否存在。然后我删除了该段;它是成功的。使用 ipcs -m 重新检查,该段已从共享更改为 IPC_PRIVATE。当休眠进程完成时,共享内存段被自动删除(因为私有(private)段总是如此)。

$  shm-master -f shm-master -s 1024 -x -t 120 &
[1] 14392
$ ID: 0, File: shm-master
Key: 0x00041BF7
ShmID: 1441795
Shared memory allocated at 0x10F2B4000
Sleeping for 120 seconds

$ ipcs -m
IPC status from <running system> as of Wed Feb 15 11:56:37 PST 2017
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x00fedc64 --rw-rw-rw-     root    wheel
m  65537 0x0052e2c1 --rw------- postgres   daemon
m  65538 0x52042973 --rw-------     root    wheel
m 1441795 0x00041bf7 --rw------- jleffler    staff

$ shm-master -f shm-master -s 1024 -d
ID: 0, File: shm-master
Key: 0x00041BF7
ShmID: 1441795
Shared memory removed
$ ipcs -m
IPC status from <running system> as of Wed Feb 15 11:56:47 PST 2017
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x00fedc64 --rw-rw-rw-     root    wheel
m  65537 0x0052e2c1 --rw------- postgres   daemon
m  65538 0x52042973 --rw-------     root    wheel
m 1441795 0x00000000 --rw------- jleffler    staff

$ sleep 120; ipcs -m
Detached from shared memory
[1]+  Done                    shm-master -f shm-master -s 1024 -x -t 120
IPC status from <running system> as of Wed Feb 15 11:58:57 PST 2017
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x00fedc64 --rw-rw-rw-     root    wheel
m  65537 0x0052e2c1 --rw------- postgres   daemon
m  65538 0x52042973 --rw-------     root    wheel

$

这是否会发生在其他系统上,我不确定,但它看起来像是合理的行为。类似的事情很可能会发生。

顺便说一句,运行一个进程来创建段和第二个进程只是附加到它,两者都在 sleep 模式下运行,并没有真正改变观察到的结果。共享内存段键变为 0,进程不受影响,并且段在两者都完成后被删除。

关于c - 在删除之前从共享内存中分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258485/

相关文章:

c - 推荐学习C

c - 如何使用Ncurses在屏幕坐标中找到光标位置?

我真的可以在运行时从数组中删除一个元素吗?

使用 SysV 计数信号量

PHP sem_get 函数失败

将 void* 转换为 long*

linux - 使用 grep 从文件夹中的文件中删除确切的字符串

linux - 在 Linux 中通过脚本安装应用程序

php - 如何在 CentOS 7/RHEL 7 上安装 Sublime 3?

c - 除了共享内存的大小之外,是什么阻止了我进一步读/写? (系统 V IPC)