gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:10 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

it would be very fine if there was a possibility to place the shared memory files of my application suite in another directory than /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 );

关于linux - 如何删除其他用户创建的共享内存文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com