2015-03-03 153 views
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,它就会将其删除。

回答

1

是的,这是预期的行为。从手册页:

shm_unlink()函数从该名称中分离出由name指定的共享内存对象。

这与正常文件中的unlink()完全相同。

如果你不想那样做,只需要close()这个文件描述符。没有其他清理是必要的。

+0

嗨,谢谢你的回应。如果我关闭文件描述符,那么最后一个存在的进程会删除文件吗? – Brandon 2015-03-03 05:59:15

+1

不,只有'shm_unlink()'会做到这一点。 – duskwuff 2015-03-03 06:24:51