对共享内存的访问控制

时间:2010-12-09 04:23:29

标签: linux unix ipc shared-memory

我想这个问题是针对Linux / Unix系统编程专家的(不幸的是我不是那种,但是)。)。

我正在构建一个在Linux / Unix,多核机器上运行的系统,其中进程通过共享内存相互通信(速度很重要 - 尽可能少地调用内核)。 当进程请求与另一个进程通信时,动态创建用于通信的共享内存“通道” - 每个进程都有一个正在接收和“接受”这些请求的侦听线程,然后创建/初始化共享内存通道。对于进程 a b ,创建了两个通道(共享内存区域) - 一个通道用作 a 和“输入”的“输出” “到 b ,反之亦然。

当创建通信信道时,处理a必须具有对其相应“输出”信道的R / W访问权限,并且只有R访问其相应的“输入”信道。其他进程必须无法获得对其他进程对之间共享的通道的W访问权限(最好不要有R访问权限)。

您能提出什么解决方案?

我在考虑:

  1. 定义我自己的系统调用(目前不太可取)
  2. 使用文件系统固有的文件权限来强制实施此访问权限
  3. 对于第二个解决方案,想法是在不同的用户ID下运行进程,并为每个进程对使用动态创建组,并相应地为每个共享内存描述符分配文件权限(R到组,R / W到编写器进程, - 其余的。)

    第二种解决方案是否可行?有没有更好的解决方案(例如涉及一些我不知道的系统调用)?

    非常感谢你的时间和帮助。

1 个答案:

答案 0 :(得分:3)

您不能使用组来执行此操作,因为无法将补充组添加到已在运行的进程中。但是,基于用户的机制可以正常工作。

在自己的uid下运行每个进程。为了创建共享内存通道,发送方使用shm_open()创建一个共享内存对象,指定O_RDWR | O_CREAT | O_EXCL和模式0600。因此它是打开它的唯一进程,只允许它的uid打开它。然后,发送方打开同一共享内存段的第二个文件描述符,这次使用O_RDONLY。它通过unix域套接字使用SCM_RIGHTS消息将此第二个只读文件描述符发送到接收进程。然后它可以关闭只读文件描述符。

发送过程和接收过程然后mmap()共享内存。接收进程具有只读访问权限,无权将其升级为读写。没有其他进程可以打开它。