2010-12-09 118 views
1

我想这个问题是针对Linux/Unix系统编程专家(不幸我不是那种类型之一))。我正在构建一个在Linux/Unix多核机器上运行的系统,其中进程通过共享内存相互通信(速度很重要 - 尽可能少地调用内核)。 当进程请求与另一个进程通信时,动态创建用于通信的共享内存“通道” - 每个进程都有一个监听线程,它正在接收和“接受”这些请求,然后创建/初始化共享内存通道。对于流程一个b,两个信道(共享存储器区域)被创建 - 一个信道被用作“输出”从一个和“输入” b和其他反之亦然。访问控制共享内存

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

你能提出什么解决方案?

我在想:

  1. 定义使用固有文件系统文件权限实行这种访问权限我自己的系统调用(目前不理想)

对于第二种解决方案,想法是在不同的用户ID下运行进程,并为每个进程对使用组的动态创建,并相应地为每个共享内存描述符分配文件权限(R将R/W分组到写入进程 - 休息)。

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

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

+0

你有没有考虑mmap的文件或命名管道?它们比SysV ipc容易得多。 – 2010-12-09 06:49:56

+0

是的,实际上使用共享内存对象的映射 – ivcha 2010-12-09 12:00:06

回答

1

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

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

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