如何删除另一个用户创建的共享内存文件?

时间:2019-04-24 12:02:05

标签: linux memory shared

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

  • 由用户“ a”运行的c程序应该能够在/ dev / shm中删除由用户“ b”创建的共享内存

  • 由于/ dev / shm的粘性,因此禁止删除另一个用户的共享内存-即使两个用户和共享内存都属于同一组

  • 在/ dev / shm中创建具有适当权限的子目录不起作用,因为shm_open()使用的文件名中不允许内部'/'

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

例如如果可以将我的应用程序套件的共享内存文件放置在/ dev / shm以外的其他目录中(最好是/ dev / shm的子目录),那将是很好的。但是我没有发现任何提示。

有人知道如何允许用户“ a”删除用户“ b”创建的共享内存吗?

1 个答案:

答案 0 :(得分: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 );