【问题标题】:Python posix IPC - communication between process running as a different userPython posix IPC - 作为不同用户运行的进程之间的通信
【发布时间】:2017-09-03 09:27:51
【问题描述】:

我正在尝试使用 POSIX IPC 在 Linux 上的两个不同进程之间建立通信。我正在使用 python 3 和基于这个库 http://semanchuk.com/philip/posix_ipc/ 的 posix 消息队列。

问题是我想在以 root 身份运行的服务器和以普通用户权限运行的客户端(单独的 python 程序)之间进行通信。

如果客户端创建消息队列那么它就可以工作,大概是因为它在普通用户下分配,而在root下运行的进程具有更高的权限。但是,我希望服务器创建消息队列,因为这样可以在服务器终止等时正确管理消息队列的关闭。

根进程是否可以创建 IPC 消息队列并允许在不同用户下运行的进程写入队列?如果有怎么办?

或者有没有可以替代 POSIX IPC 的替代品(例如 Sys V)? 我希望避免使用 UNIX 套接字,因为我不想使用额外的开销。

-- 最新尝试更新--

我已经阅读了我能找到的所有文档。图书馆自述文件说他们发现它不管权限如何都可以工作,但这不是我的经验。

Linux 编程接口(库所依赖的)声明同时使用 mode 和 umask,但即使我在消息队列设置中使用 os.umask(000) 后跟 mode=666,我仍然会从客户。

【问题讨论】:

    标签: python python-3.x posix ipc root


    【解决方案1】:

    您可能想尝试 Linux 域套接字。

    可以使用文件系统权限管理对基于文件系统的访问。抽象命名空间中的域套接字可以通过检查连接进程的凭据 (PID/UID) 来保护,另请参阅:“SCM_RIGHTS”。

    域套接字非常快——它们被 Xorg 使用,因此内核开发人员对它们进行了很好的优化。它们也比 POSIX IPC(Android 支持)更便携。基于流的模式在面向消息的 IPC 中使用可能有点尴尬,因此您应该考虑改用数据报模式。

    【讨论】:

    • 我不想使用套接字的原因是因为这将用于处理传入的 Web 请求,然后需要将这些请求传递到最终服务器。如果使用域套接字,则每个 Web 请求都需要建立与套接字的连接,发送请求并接收响应,然后释放套接字并返回。而如果我使用消息队列,它可以只获取内存地址,将消息添加到队列中,然后检查响应(如果需要)。
    • @StewartWatkiss 没有必要为每条消息打开新的套接字。数据报套接字上的写入是原子的,因此您可以保留一个连接的套接字,在任意数量的生产者/消费者之间共享。或者一个套接字池。
    • 谢谢。我将尝试使用套接字。如果队列有效,那么它们会更好地适应我希望通信的工作方式,但我尝试了许多不同的方法来获得使用 sysV 和 posix 队列工作的权限,但没有任何成功。我将需要更改我的代码将消息排队的方式以将其更改为套接字,但这可能比在消息队列上浪费更多时间要好。
    猜你喜欢
    • 2015-08-11
    • 2011-03-22
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多