c - 尽管再次使用 O_CREAT,但以相同名称重新打开时 shm_open() 失败

标签 c linux posix shared-memory

根据http://man7.org/linux/man-pages/man3/shm_open.3.html , 它说

 After a successful shm_unlink(), attempts to shm_open() an object with the same name fail (unless O_CREAT was
 specified, in which case a new, distinct object is created).

S,我试过这个。我正在使用下面的示例,它在执行 shm_unlink 之后创建新的共享内存对象,正如他们所说,我使用了 O_CREAT。

但是当我运行这个问题时,它给我错误相关的bus error

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

int main(void) {
    // Open shared memory
    int fd = shm_open("TEST", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    ftruncate(fd, sizeof(int));

    // Map shared memory
    int *shm = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    close(fd);

    // Access shared memory
    *shm = 0;

    // Unmap shared memory
    munmap(shm, sizeof(int));

    if(shm_unlink("TEST")){
        printf("************success****************");
    }

    fd = shm_open("TEST", O_CREAT |O_RDWR, S_IRUSR | S_IWUSR);
    int *shm2 = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    *shm2 = 0;

    return 0;
}

shm_unlink 后再次创建同名共享内存的正确过程是什么?

最佳答案

您在第二次尝试时访问了错误的共享内存(应该是 shm2,而不是 shm),并且不要忘记截断。

同样不相关,但 shm_unlink 成功时返回 0。

#include <sys/mman.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(void) {
    // Open shared memory
    int fd = shm_open("TEST", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    ftruncate(fd, sizeof(int));

    // Map shared memory
    int *shm = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    close(fd);

    // Access shared memory
    *shm = 0;

    // Unmap shared memory
    munmap(shm, sizeof(int));

    if(!shm_unlink("TEST")){
        printf("************success****************");
    }

    fd = shm_open("TEST", O_CREAT |O_RDWR, S_IRUSR | S_IWUSR);
    int *shm2 = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    ftruncate(fd, sizeof(int));
    *shm2 = 0;

    return 0;
}

关于c - 尽管再次使用 O_CREAT,但以相同名称重新打开时 shm_open() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54289816/

相关文章:

c - 从设备包含的文件中的 st_dev 字段查找设备文件

收到信号 SIGTERM 后关闭 FIFO

c++ - 处理 c 字符串时如何用当前输入替换用户的第一个输入

在 VGA 图形中绘制圆圈时检查屏幕边界

PHP 在 Linux 上显示错误日志

php - SQLSTATE[28000] [1045] 拒绝用户 'root' @'localhost' 的访问(使用密码 : YES)

centos - 在 POSIX 命名信号量中,sem_unlink() 删除信号量的名称

c - C 中的类型转换是如何实现的?

c - 如何将动态分配的字符串添加到 C 中的字符串数组中?

linux - Ubuntu Sublime Text 2 Java 脚本编译但不运行