[英]Message Passing between Processes without using dedicated functions
我正在編寫一個 C 程序,其中我需要在子進程和主進程之間傳遞消息。 但問題是,我需要在不使用msgget()
和msgsnd()
等函數的情況下做到這一點
我該如何實施? 我可以使用什么樣的技術?
有多種方式與子進程通信,這取決於您的應用程序。
很大程度上取決於您的應用程序的抽象級別。
-- 如果抽象級別低:
如果您需要非常快速的通信,您可以使用共享內存(例如shm_open()
)。 但是要正確同步會很復雜。
最常用的方法,如果我是你的話,我會使用的方法是:管道。 它簡單、快速,而且由於epoll()
和那些異步 I/O API 支持管道文件描述符,因此您可以利用這一事實。
另一個好處是,如果您的應用程序增長,並且您需要與遠程進程(不在本地機器中的進程)通信,則將管道適配到套接字非常容易,基本上它仍然是從/向文件讀取/寫入相同的描述符。
此外,Unix 域套接字(在其他平台中稱為“命名管道”)讓您擁有一個服務器進程,該進程創建一個具有眾所周知名稱的偵聽套接字(例如文件系統中的一個條目,例如/tmp/my_socket
) 並且本地機器中的所有客戶端都可以連接到它。
管道、網絡套接字或 unix 域套接字是非常可互換的解決方案,因為 - 如前所述 - 都涉及從文件描述符讀取數據/向文件描述符寫入數據,因此您可以重用代碼。
文件描述符的缺點是您將數據寫入字節流,因此您需要自己實現消息的“消息流協議”,以“解流”您的消息(編組/解組),但這就是在大多數情況下並不那么復雜,這也取決於您發送的消息類型。
我會傳遞其他解決方案,例如內存映射文件等。
-- 如果抽象級別更高:
您可以使用 3rd 方消息傳遞系統,例如 RabbitMQ、ZMQ 等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.