【问题标题】:Shared memory - shm_open causing permission denied共享内存 - shm_open 导致权限被拒绝
【发布时间】:2023-03-19 12:08:01
【问题描述】:

我正在编写一个使用 POSIX 共享内存的程序,并且出现了一个我不确定如何修复的错误。我寻找了类似的问题,但找不到与这个特定问题相关的任何问题。

涉及两个文件 - server.c,其中包含程序运行的代码,以及 shm.c,其中包含为处理共享内存提供抽象的函数。这是一项任务,所以我不能偏离当前结构太远。

以下是每个文件的相关代码:

服务器.c

int shmFd;

shmFd = createSHM(SHNAME);

shm.c

int createSHM(char * shname)
{
    int fileDesc;

    fileDesc = shm_open(shname, O_CREAT | O_RDWR, 0);

    if(fileDesc == -1)
    {
        perror("Error: Could not create shared memory space");
    }

  return fileDesc;
}

shm.h

#define SHNAME "/shmserver" 

当我尝试在终端运行构建的程序时,出现以下错误:

Error: Could not create shared memory space: Permission denied 

任何帮助将不胜感激。

【问题讨论】:

  • 给它一些非零的mode怎么样?
  • @EugeneSh。我尝试将模式更改为 S_IRWXU(包括 stat.h)。还尝试了 S_IRWXO 和 S_IRWXG。仍然给出同样的错误
  • @bitrost:可能是因为您使用 0 模式至少运行了一次程序,创建了您无法访问的 shm 对象,该对象现在仍然存在。您需要将其删除。如果您在 Linux 上运行,请尝试 ls /dev/shm 查看所有现有的 shm 对象...
  • 文件:shm.h 似乎缺少文件shm.c 中函数的原型。文件:server.c 似乎缺少声明:#include "shm.h
  • 调用shm_open()和调用perror()失败后,代码需要调用shm_unlink()exit( EXIT_FAILURE )

标签: c posix shared-memory


【解决方案1】:

线

fileDesc = shm_open(shname, O_CREAT | O_RDWR, 0);

不授予任何人对共享内存对象的任何访问权限。一旦你创建了一个没有访问权限的共享内存对象,只有 root 用户才能打开它。

改为使用(例如)

fileDesc = shm_open(shname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IXUSR);

(显然,您可以允许其他用户访问共享内存。但您至少需要允许自己访问它;否则,一旦创建它,​​您将无法打开它。 )

也许值得注意的是您的错误消息不正确,因此您可能会误导自己(和其他人)。对shm_open 的调用在创建 共享内存对象时不会失败。失败的原因是在没有用户所有权限的情况下打开已创建的共享内存对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2018-05-27
    • 2021-04-07
    • 2017-02-11
    • 2020-03-05
    相关资源
    最近更新 更多