共享内存的访问控制

4
我想这个问题是针对Linux / Unix系统编程专家的(不幸的是我还不是那种人; ))。
我正在构建一个在Linux / Unix上运行的系统,多核机器,在这个系统中,进程通过共享内存相互通信(速度很重要 - 尽可能少地调用内核)。当一个进程请求与另一个进程通信时,将动态创建用于通信的共享内存“通道” - 每个进程都有一个监听线程,该线程接收并“接受”这些请求,然后创建/初始化共享内存通道。对于进程a和b,创建了两个通道(共享内存区域) - 一个通道用作a的“输出”和b的“输入”,另一个反之亦然。
当创建通信通道时,必须确保进程a对其对应的“输出”通道具有读写访问权限,并且仅对其对应的“输入”通道具有读取访问权限。其他进程不能获得对其他进程之间共享的通道的写入访问权限(最好甚至不能获得读取访问权限)。
您能提供什么解决方案?
我在考虑:
1.定义自己的系统调用(目前不可取)
2.使用文件系统固有的文件权限来强制执行此访问权限
对于第二种解决方案,想法是在不同的用户ID下运行进程,并为每个进程对分配的组进行动态创建,并相应地分配每个共享内存描述符的文件权限(对于组为R,对于写入进程为R / W,- 对于其余部分)。
第二种解决方案可行吗?是否有更好的解决方案(例如涉及我不知道的一些系统调用)?
非常感谢您的时间和帮助。

你有考虑过使用mmap映射文件或命名管道吗?它们比SysV ipc更简单。 - J-16 SDiZ
是的,实际上共享内存对象的映射被使用。 - ivcha
1个回答

4
您不能使用组来实现此目的,因为不可能向已运行的进程添加补充组。但是,基于用户的机制可以正常工作。
将每个进程都运行在其自己的uid下。要创建共享内存通道,发送方使用shm_open()创建共享内存对象,指定O_RDWR | O_CREAT | O_EXCL和模式0600。因此,它是唯一打开它的进程,并且只有它的uid被允许打开它。然后,发送方为同一共享内存段打开第二个文件描述符,这次使用O_RDONLY。它使用unix域套接字上的SCM_RIGHTS消息将此第二个只读文件描述符发送到接收进程。然后,它可以关闭只读文件描述符。
发送进程和接收进程然后mmap()共享内存。接收进程具有只读访问权限,并且没有权利将其升级为读写权限。其他任何进程都无法打开它。

1
这仅在每个配对连接初始化时添加了几个系统调用,非常优秀。谢谢你的答案! - ivcha
1
@kaptoxic:确实,我建议在“请求通信”消息通道中也使用UNIX域套接字,这样您就可以通过它发送共享内存文件描述符。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接