0
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;
}
读者:
#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
,它就会将其删除。
嗨,谢谢你的回应。如果我关闭文件描述符,那么最后一个存在的进程会删除文件吗? – Brandon 2015-03-03 05:59:15
不,只有'shm_unlink()'会做到这一点。 – duskwuff 2015-03-03 06:24:51