gpt4 book ai didi

linux - 对共享内存的访问控制

转载 作者:太空狗 更新时间:2023-10-29 11:11:16 26 4
gpt4 key购买 nike

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

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

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

您可以建议什么解决方案?

我在想:

  1. 定义我自己的系统调用(目前不推荐)
  2. 使用文件系统固有的文件权限来施加这种访问权限

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

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

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

最佳答案

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

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

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

关于linux - 对共享内存的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394822/

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