我想这个问题是针对Linux / Unix系统编程专家的(不幸的是我不是那种,但是)。)。
我正在构建一个在Linux / Unix,多核机器上运行的系统,其中进程通过共享内存相互通信(速度很重要 - 尽可能少地调用内核)。 当进程请求与另一个进程通信时,动态创建用于通信的共享内存“通道” - 每个进程都有一个正在接收和“接受”这些请求的侦听线程,然后创建/初始化共享内存通道。对于进程 a 和 b ,创建了两个通道(共享内存区域) - 一个通道用作 a 和“输入”的“输出” “到 b ,反之亦然。
当创建通信信道时,处理a必须具有对其相应“输出”信道的R / W访问权限,并且只有R访问其相应的“输入”信道。其他进程必须无法获得对其他进程对之间共享的通道的W访问权限(最好不要有R访问权限)。
您能提出什么解决方案?
我在考虑:
对于第二个解决方案,想法是在不同的用户ID下运行进程,并为每个进程对使用动态创建组,并相应地为每个共享内存描述符分配文件权限(R到组,R / W到编写器进程, - 其余的。)
第二种解决方案是否可行?有没有更好的解决方案(例如涉及一些我不知道的系统调用)?
非常感谢你的时间和帮助。
答案 0 :(得分:3)
您不能使用组来执行此操作,因为无法将补充组添加到已在运行的进程中。但是,基于用户的机制可以正常工作。
在自己的uid下运行每个进程。为了创建共享内存通道,发送方使用shm_open()
创建一个共享内存对象,指定O_RDWR | O_CREAT | O_EXCL
和模式0600
。因此它是打开它的唯一进程,只允许它的uid打开它。然后,发送方打开同一共享内存段的第二个文件描述符,这次使用O_RDONLY
。它通过unix域套接字使用SCM_RIGHTS
消息将此第二个只读文件描述符发送到接收进程。然后它可以关闭只读文件描述符。
发送过程和接收过程然后mmap()
共享内存。接收进程具有只读访问权限,无权将其升级为读写。没有其他进程可以打开它。