簡體   English   中英

不使用專用函數的進程間消息傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM