从shell中使用shm_unlink命令?

5
我有一个使用shm_open创建共享内存对象的程序,现在正在处理这个程序。它试图使用shm_unlink释放对象,但有时会因为编程错误在调用之前崩溃。这种情况下,我需要手动“取消链接”共享内存对象,并希望能够使用普通的Linux实用程序(即没有编写任何C代码)在正常shell中完成此操作。
这可行吗?根据这个问题的说法,似乎可以在/dev/shm/path_passed_to_shm_open上使用unlink(1),但手册并不清楚。

尝试访问unix.stackexchange.com或superuser.com以获取非编程问题的答案。 - Barmar
@Barmar 这对我来说似乎是一个非常相似的问题,与我链接的那个问题很类似。可以改写成“通过shm_open创建的共享内存对象是否可以通过在/dev/shm/中取消链接相应的文件来删除?”但我认为这只是一个非常小的差别。我认为这个问题仍然与编程有关,只是因为我更愿意重用现有的*nix工具而不是重新发明轮子。我认为投票关闭的理由不适用于这个问题,因为shm_open绝对是“主要用于编程”,而不是“通用计算工具”。 - Patrick Collins
1个回答

8

如果没有其他进程映射该对象,解除与/dev/shm中的文件的链接将删除共享内存对象。

与在内核中实现的SYSV共享内存不同,POSIX共享内存对象只是“伪装成文件”的东西。

当您调用shm_open和mmap时,可以在进程映射中看到以下内容(使用pmap -X):

 Address Perm   Offset Device   Inode Mapping
b7737000 r--s 00000000  00:0d 2267945 test_object

设备的主设备号和次设备号对应于挂载在 /dev/shm 上的 tmpfs(某些系统将其挂载在 /run 上,然后将 /dev/shm 符号链接到 /run/shm)。
列出文件夹将显示相同的 inode 号码:
$ ls -li /dev/shm/
2267945 -rw------- 1 mikel mikel 1 Apr 14 13:36 test_object

和其他任何inode一样,只有当所有引用被删除时,空间才会被释放。如果我们关闭唯一引用此文件的程序,我们将看到:

$ cat /proc/meminfo | grep Shmem
Shmem:               700 kB

一旦我们移除最后一个引用(在/dev/shm中创建),空间就会被释放:

$ rm /dev/shm/test_object
$ cat /proc/meminfo | grep Shmem
Shmem:               696 kB

如果你感到好奇,可以查看glibc源代码中对应的文件。shm_directory.cshm_directory.h 生成的文件名为 /dev/your_shm_name。实现 shm_openshm_unlink 只是打开和取消链接这个文件。因此,rm /dev/shm/your_shm_name 执行相同的操作。

非常棒的答案。我会稍微等待一下,以防有人想要添加其他内容,但这个回答很好。 - Patrick Collins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接