shm_unlink 后访问内存

Sre*_*ari 6 c linux embedded-linux

的操作shm_unlink对我来说不清楚。我创建了一个共享内存对象并映射到一个进程。后来,我做shm_unlink了内存对象。接下来shm_unlink,我能够访问相同的内存进行读写。这怎么可能?由于内存对象被 破坏shm_unlink,我预计在这种情况下会出现分段错误。但是,并没有发生?是什么原因?是什么shm_unlink究竟在这里干什么?

下面是代码片段。

main(int argc, char * argv[])
{
    int   fd;
    char  *addr;
    int i = 0;

    /*
    * In case the unlink code isn't executed at the end
    */
    if (argc != 1) {
        shm_unlink("/bolts");
        return EXIT_SUCCESS;
    }

    /* Create a new memory object */
    fd = shm_open("/bolts", O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        fprintf(stderr, "Open failed : %s\n",
            strerror(errno));
        return EXIT_FAILURE;
    }

    /* Set the memory object's size */
    if (ftruncate(fd, 1024) == -1) {
        fprintf(stderr, "ftruncate : %s\n", strerror(errno));
        return EXIT_FAILURE;
    }

    addr = mmap(0, 1024, PROT_READ | PROT_WRITE,
        MAP_SHARED, fd, 0);

    if (addr == MAP_FAILED) {
        fprintf(stderr, "mmap failed:%s\n", strerror(errno));
        return EXIT_FAILURE;
    }

    sleep(10);

    printf("Map addr is %x\n",(unsigned int) addr);

    if (fork())
    {
        sleep(10);
        strcpy (addr, "Sreehari in parent\n");
    }
    else
    {
        strcpy(addr,  "I am in child\n");

    }

    sleep(6);
    i = shm_unlink("/bolts");

    printf("addr is %s, i is %d \n", addr, i);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

ter*_*ill 2

如 shm_unlink手册页中所述:

“名称应在 shm_unlink() 返回之前删除,但内存对象内容的删除应推迟,直到所有对共享内存对象的打开和映射引用都已删除。”

这意味着取消链接后内存可能仍然存在。