如何删除其他用户创建的共享内存文件?

问题描述 投票:1回答:1

我刚刚遇到了/ dev / shm权限的问题:我有一套软件,多个用户应该可以使用。共享资源的权限使用相同的组。但是在共享内存的情况下,我遇到了这个问题:

  • 用户“a”运行的c程序应该能够删除用户“b”创建的/ dev / shm中的共享内存
  • 由于/ dev / shm的粘滞位,禁止删除其他用户的共享内存 - 即使用户和共享内存属于同一组
  • 使用适当的权限在/ dev / shm中创建子目录不起作用,因为shm_open()使用的文件名中不允许使用内部'/'

好吧,我不想删除/ dev / shm的粘性位,因为这是linux标准。

例如。如果有可能将我的应用程序套件的共享内存文件放在/ dev / shm之外的另一个目录中 - 理想情况下是/ dev / shm的子目录,那将是非常好的。但我没有发现任何暗示如何做到这一点。

有没有人有想法,如何允许用户“a”删除用户“b”创建的共享内存?

linux memory shared
1个回答
0
投票

如果有可能将我的应用程序套件的共享内存文件放在除/ dev / shm之外的其他目录中,那将是非常好的

除了必须在shm_open()之外,/dev/shm使用的文件没什么特别之处。您可以使用完全相同的方式mmap()任何具有共享访问权限的文件。

不要使用shm_open()打开文件以用作共享内存。 shm_open()唯一真正做的就是为/dev/shm中的文件提供文件描述符。 This is the entirety of glibc's shm_open() implementation

/* 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 );
© www.soinside.com 2019 - 2024. All rights reserved.