Почему мне отказано в разрешении на попытку 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()
вызов.
С другой стороны, вы можете попробовать следующее, чтобы убедиться, что ошибка «Отказано в доступе» связана с недостаточными правами доступа к файлу:
- запустите тестовую программу от имени root
-
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.