shm_unlink 的预期行为?
Expected behaviour of shm_unlink?
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;
}
Reader:
#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
。 reader也能映射成功
但是,reader 只能对文件进行一次内存映射。第一次关闭后立即删除,第二次调用shm_open
失败
这是预期的行为吗? shm_unlink
是否应该删除该文件,即使作者打开了它?一旦 reader 调用 shm_unlink
.
,它就会删除它
是的,这是预期的行为。来自手册页:
The shm_unlink()
function disassociates the shared memory object specified by name
from that name.
在这方面与普通文件 unlink()
完全一样。
如果您不想这样做,只需 close()
文件描述符即可。无需其他清理工作。
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;
}
Reader:
#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
。 reader也能映射成功
但是,reader 只能对文件进行一次内存映射。第一次关闭后立即删除,第二次调用shm_open
失败
这是预期的行为吗? shm_unlink
是否应该删除该文件,即使作者打开了它?一旦 reader 调用 shm_unlink
.
是的,这是预期的行为。来自手册页:
The
shm_unlink()
function disassociates the shared memory object specified byname
from that name.
在这方面与普通文件 unlink()
完全一样。
如果您不想这样做,只需 close()
文件描述符即可。无需其他清理工作。