shm_unlink
是否存储引用计数以确定何时删除文件?
我问,因为我有以下内容:
编剧:
#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
using namespace std;
void Sleep(int ms)
{
usleep(ms * 1000);
}
int main()
{
int fd = shm_open("/Test", O_CREAT | O_TRUNC | O_RDWR, 0600);
if (fd != -1)
{
ftruncate(fd, 512);
void *ptr = mmap(0, 512, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr)
{
sprintf((char*)ptr, "hello");
std::cout<<"Written & Sleeping\n";
Sleep(10000);
munmap(ptr, 512);
}
close(fd);
shm_unlink("/Test");
}
return 0;
}
阅读器:
#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
using namespace std;
void Sleep(int ms)
{
usleep(ms * 1000);
}
int main()
{
int fd = shm_open("/Test", O_RDWR, 0600);
if (fd != -1)
{
ftruncate(fd, 512);
void *ptr = mmap(0, 512, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr)
{
printf("Read: %s\n", (char*)ptr);
munmap(ptr, 512);
}
close(fd);
shm_unlink("/Test");
}
Sleep(1000);
fd = shm_open("/Test", O_RDWR, 0600);
if (fd != -1)
{
ftruncate(fd, 512);
void *ptr = mmap(0, 512, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr)
{
printf("Read: %s\n", (char*)ptr);
munmap(ptr, 512);
}
close(fd);
shm_unlink("/Test");
}
return 0;
}
作者将内存映射得很好。它在/dev/shm
中显示为预期的Test
。读者也可以成功地映射它。
但是,读者只能将内存映射文件ONCE。在第一次关闭它之后,会立即将其删除,并且对shm_open
的第二次调用失败。
这是预期的行为吗?即使作者打开文件,shm_unlink
是否应该删除该文件?一旦读者调用shm_unlink
,它就会删除它。
答案 0 :(得分:1)
是的,这是预期的行为。从手册页:
shm_unlink()
函数将name
指定的共享内存对象与该名称解除关联。
在这方面,它与普通文件的unlink()
完全相同。
如果您不想这样做,只需close()
文件描述符。不需要其他清理工作。