2017-09-03 75 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隊列沒有任何成功。我需要改變我的代碼將消息排隊以將其更改爲套接字的方式,但這可能比在消息隊列上多花時間更好。 –

相關問題