Почему мне отказано в разрешении на попытку shm_open?

Рассмотрим следующую программу на C:

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

int main() {
    const char* name = "/memmap_ipc_shm";
    int shmFd = shm_open(name, O_RDWR | O_CREAT, 0777);
    if (shmFd < 0) {
        fprintf(stderr,"bad shmfd opening %s: %s\n", name, strerror(errno));
        return -1;
    }
    return 0;
}

Когда я запускаю его в своей системе GNU / Linux (Devuan Beowulf, Linux 5.10.0-9, процессор amd64), я получаю:

      bad shmfd opening /memmap_ipc_shm: Permission denied

Почему мне отказали в разрешении? Я почти уверен, что выполнил все рекомендации в man shm_open на странице мои запрошенные разрешения кажутся нормальными - так что не так?

2 ответа

В Linux вы можете проверить права доступа к следующему каталогу:

/dev/shm

Если ваша программа не может создать файл:/dev/shm/memmap_ipc_shm, то при вызове он получит эту ошибку «Отказано в доступе».

Вы можете предоставить вашей программе надлежащий доступ к этому каталогу для создания файла, обозначенного какnameв вашейshm_open()вызов.

С другой стороны, вы можете попробовать следующее, чтобы убедиться, что ошибка «Отказано в доступе» связана с недостаточными правами доступа к файлу:

  1. запустите тестовую программу от имени root
  2. sudo chmod 0777 /dev/shm

Это может произойти, если вы уже создали этот объект общей памяти, но, возможно, без соответствующего файла . Попробуйте позвонить shm_unlink(name)чтобы убедиться, что это так (или даже сделайте это как root, если вы снова столкнетесь с ошибкой разрешения).

Обратите внимание, что это поведение, кажется, конфликтует со страницей руководства:

      O_EXCL If O_CREAT was also specified, and a shared memory object with the given
       name already exists, return an error.  The check for the existence of the
       object, and its creation if it does not exist, are performed atomically.
Другие вопросы по тегам