2015-03-03 156 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