shm_unlink 来自 shell?
shm_unlink from the shell?
我有一个程序可以使用我正在处理的 shm_open
创建一个共享内存对象。它尝试使用 shm_unlink
释放对象,但有时编程错误会导致它在调用之前崩溃。在那种情况下,我需要取消链接共享内存对象 "by hand," 并且我希望能够在正常 shell 中完成它,而无需编写任何 C 代码——即使用正常 [=22] =] 公用事业。
可以吗? This question 似乎说在 /dev/shm/path_passed_to_shm_open
上使用 unlink(1)
,但联机帮助页不清楚。
取消链接 /dev/shm
中的文件将删除共享内存对象,如果没有其他进程映射该对象。
与在内核中实现的 SYSV 共享内存不同,POSIX 共享内存对象只是 "files in disguise"。
当你调用shm_open和mmap时,在process进程图中可以看到如下内容(使用pmap -X
):
Address Perm Offset Device Inode Mapping
b7737000 r--s 00000000 00:0d 2267945 test_object
设备主要和次要编号对应于安装在 /dev/shm
的 tmpfs(某些系统将其安装在 /运行,然后符号链接 /dev/shm
到 /run/shm
) .
文件夹列表将显示相同的 inode 编号:
$ ls -li /dev/shm/
2267945 -rw------- 1 mikel mikel 1 Apr 14 13:36 test_object
与任何其他 inode 一样,space 将在删除所有引用后被释放。如果我们关闭唯一引用它的程序,我们会看到:
$ cat /proc/meminfo | grep Shmem
Shmem: 700 kB
一旦我们删除最后一个引用(在 /dev/shm
中创建),space 将被释放:
$ rm /dev/shm/test_object
$ cat /proc/meminfo | grep Shmem
Shmem: 696 kB
如果你好奇的话,你可以看看glibc源码中相应的文件。 shm_directory.c and shm_directory.h generate the filename as /dev/your_shm_name
. The implementations shm_open and shm_unlink 只需打开并取消链接此文件。所以应该很容易看出rm /dev/shm/your_shm_name
执行相同的操作,
我有一个程序可以使用我正在处理的 shm_open
创建一个共享内存对象。它尝试使用 shm_unlink
释放对象,但有时编程错误会导致它在调用之前崩溃。在那种情况下,我需要取消链接共享内存对象 "by hand," 并且我希望能够在正常 shell 中完成它,而无需编写任何 C 代码——即使用正常 [=22] =] 公用事业。
可以吗? This question 似乎说在 /dev/shm/path_passed_to_shm_open
上使用 unlink(1)
,但联机帮助页不清楚。
取消链接 /dev/shm
中的文件将删除共享内存对象,如果没有其他进程映射该对象。
与在内核中实现的 SYSV 共享内存不同,POSIX 共享内存对象只是 "files in disguise"。
当你调用shm_open和mmap时,在process进程图中可以看到如下内容(使用pmap -X
):
Address Perm Offset Device Inode Mapping
b7737000 r--s 00000000 00:0d 2267945 test_object
设备主要和次要编号对应于安装在 /dev/shm
的 tmpfs(某些系统将其安装在 /运行,然后符号链接 /dev/shm
到 /run/shm
) .
文件夹列表将显示相同的 inode 编号:
$ ls -li /dev/shm/
2267945 -rw------- 1 mikel mikel 1 Apr 14 13:36 test_object
与任何其他 inode 一样,space 将在删除所有引用后被释放。如果我们关闭唯一引用它的程序,我们会看到:
$ cat /proc/meminfo | grep Shmem
Shmem: 700 kB
一旦我们删除最后一个引用(在 /dev/shm
中创建),space 将被释放:
$ rm /dev/shm/test_object
$ cat /proc/meminfo | grep Shmem
Shmem: 696 kB
如果你好奇的话,你可以看看glibc源码中相应的文件。 shm_directory.c and shm_directory.h generate the filename as /dev/your_shm_name
. The implementations shm_open and shm_unlink 只需打开并取消链接此文件。所以应该很容易看出rm /dev/shm/your_shm_name
执行相同的操作,