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