2017-09-03 124 views
0

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

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

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

根进程是否可以创建IPC消息队列并允许进程在不同的用户写入队列?如果是这样如何?

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

- 更新的最新尝试 -

我所有的文件我能找到阅读起来。图书馆自述说,他们发现无论权限如何都可以工作,但那不是我的经验。

Linux编程接口(库所依赖的)声明同时使用mode和umask,但即使我在消息队列设置中使用os.umask(000),然后是mode = 666,我仍然获得权限被拒绝客户端。

回答

0

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

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

域套接字速度非常快 - 它们被Xorg使用,所以内核开发人员对它们进行了优化。它们比POSIX IPC(Android支持)更便于携带。基于流的模式在面向消息的IPC中使用可能有些尴尬,所以您应该考虑切换到数据报模式。

+0

我不想使用套接字的原因是因为这将用于处理传入的Web请求,然后需要将它传递到最终服务器。如果使用域套接字,那么每个Web请求都需要建立到套接字的连接,在释放套接字并返回之前发送请求并接收响应。 而如果我使用了一个消息队列,它可以获得内存地址,将消息添加到队列中,然后检查响应(如果需要)。 –

+0

@StewartWatkiss为每封邮件打开新套接字是不必要的。数据报套接字上的写入是原子的,所以你可以保留一个连接的套接字,在任何数量的生产者/消费者之间共享。或者一个插座池。 – user1643723

+0

谢谢。我打算给套接字一个去。如果队列已经工作,那么他们会更适合我希望通信如何工作,但我已经尝试了许多不同的方式来获得权限,同时使用sysV和posix队列没有任何成功。我需要改变我的代码将消息排队以将其更改为套接字的方式,但这可能比在消息队列上多花时间更好。 –

相关问题