shm_unlink的预期行为

Expected behaviour of shm_unlink?

本文关键字:unlink shm      更新时间:2023-10-16

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 & Sleepingn";
            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: %sn", (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: %sn", (char*)ptr);
            munmap(ptr, 512);
        }
        close(fd);
        shm_unlink("/Test");
    }
    return 0;
}

作者很好地描绘了记忆。它在/dev/shm中显示为预期的Test。读取器也可以成功地映射它。

但是,读取器只能对文件进行一次内存映射。在第一次关闭它之后,它立即被删除,并且对shm_open的第二次调用失败。

这是预期的行为吗?shm_unlink是否应该删除文件,即使写入程序打开了它?一旦读取器调用shm_unlink,它就会将其删除。

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

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

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

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