shm_unlink 的预期行为?

Expected behaviour of 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;
}

Reader:

#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。 reader也能映射成功

但是,reader 只能对文件进行一次内存映射。第一次关闭后立即删除,第二次调用shm_open失败

这是预期的行为吗? shm_unlink 是否应该删除该文件,即使作者打开了它?一旦 reader 调用 shm_unlink.

,它就会删除它

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

The shm_unlink() function disassociates the shared memory object specified by name from that name.

在这方面与普通文件 unlink() 完全一样。

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