shm_unlink的预期行为?

时间:2015-03-03 05:46:52

标签: c++ ipc shared-memory

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 个答案:

答案 0 :(得分:1)

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

  

shm_unlink()函数将name指定的共享内存对象与该名称解除关联。

在这方面,它与普通文件的unlink()完全相同。

如果您不想这样做,只需close()文件描述符。不需要其他清理工作。