Как удалить файл общей памяти, созданный другим пользователем? - PullRequest
1 голос
/ 24 апреля 2019

У меня просто проблема с разрешениями / dev / shm: У меня есть набор программного обеспечения, которое должны использовать несколько пользователей. Разрешения общих ресурсов предоставляются с использованием той же группы. Но в случае разделяемой памяти я сталкиваюсь с этой проблемой:

  • c-программа, запускаемая пользователем "a", должна иметь возможность удалить разделяемую память в / dev / shm, которая была создана пользователем "b"

  • из-за залипания бита / dev / shm запрещено удалять общую память другого пользователя - даже если оба пользователя и общая память принадлежат к одной группе

  • создание подкаталога в / dev / shm с соответствующими разрешениями не работает, так как внутренние '/' не допускаются в имени файла, используемого shm_open ()

Ну, я не хочу удалять липкий бит / dev / shm, так как это стандарт Linux.

например. было бы очень хорошо, если бы была возможность поместить файлы общей памяти моего набора приложений в другой каталог, чем / dev / shm - в идеале это подкаталог / dev / shm. Но я не нашел намека на то, как это сделать.

У кого-нибудь есть идея, как разрешить пользователю "a" удалять общую память, созданную пользователем "b"?

1 Ответ

0 голосов
/ 24 апреля 2019

было бы очень хорошо, если бы была возможность поместить файлы общей памяти моего набора приложений в другой каталог, чем / dev / shm

В файлах, используемых shm_open(), нет ничего особенного, кроме того, что они должны быть в /dev/shm. Вы можете mmap() любой файл с общим доступом точно так же.

Не используйте shm_open(), чтобы открыть файл для использования в качестве разделяемой памяти. Единственное, что действительно делает shm_open(), - это дает вам дескриптор файла к файлу, расположенному в /dev/shm. Это полная реализация shm_open() в glibc :

/* Open shared memory object.  */
int
shm_open (const char *name, int oflag, mode_t mode)
{
  SHM_GET_NAME (EINVAL, -1, "");

  oflag |= O_NOFOLLOW | O_CLOEXEC;

  /* Disable asynchronous cancellation.  */
  int state;
  pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state);

  int fd = open (shm_name, oflag, mode);
  if (fd == -1 && __glibc_unlikely (errno == EISDIR))
    /* It might be better to fold this error with EINVAL since
       directory names are just another example for unsuitable shared
       object names and the standard does not mention EISDIR.  */
    __set_errno (EINVAL);

  pthread_setcancelstate (state, NULL);

  return fd;
}

Все, что нужно сделать, это убедиться, что имя файла для файла в /dev/shm.

Просто замените shm_open() простым open() и поместите файл общей памяти в нужное вам место.

вместо

int fd = shm_open( "shared_memory_file", oflag, mode );

просто используйте

int fd = open( "/path/to/my/shared_memory_file", oflag, mode );
...