不使用专用函数的进程间消息传递
Message Passing between Processes without using dedicated functions
我正在编写一个 C 程序,我需要在其中在子进程和主进程之间传递消息。但问题是,我需要在不使用 msgget()
和 msgsnd()
之类的函数的情况下执行此操作
我该如何实施?我可以使用什么样的技术?
有多种方法可以与子进程通信,这取决于您的应用程序。
很大程度上取决于您的应用程序的抽象级别。
-- 如果抽象层次低:
如果您需要非常的快速通信,您可以使用共享内存(例如shm_open()
)。但是正确同步会很复杂。
最常用的方法,如果我处在你的位置,我会使用的方法是:管道。
它简单、快速,并且由于 epoll()
和那些异步 I/O API 支持管道文件描述符,您可以利用这一事实。
另一个优点是,如果您的应用程序增长,并且您需要与远程进程(不在您本地机器上的进程)通信,将管道适配为套接字是非常 easy,基本上还是一样reading/writingfrom/to一个文件描述符
此外,Unix 域套接字(在其他平台中称为“命名管道”)让您拥有一个服务器进程,该进程创建一个具有众所周知名称(例如文件系统中的条目,例如作为 /tmp/my_socket
),并且 local 机器中的所有客户端都可以连接到它。
管道、网络套接字或 unix 域套接字是非常可互换的解决方案,因为 - 如前所述 - 都涉及 reading/writing 数据 from/to 文件描述符,因此您可以重用代码。
文件描述符的缺点是你正在将数据写入字节流,因此你需要自己实现消息的“消息流协议”,以“取消流”你的消息(marshalling/unmarshalling),但在大多数情况下这并不复杂,这还取决于您发送的消息类型。
我会传递其他解决方案,例如内存映射文件等。
-- 如果抽象层次更高:
您可以使用第 3 方消息传递系统,例如 RabbitMQ、ZMQ 等。
我正在编写一个 C 程序,我需要在其中在子进程和主进程之间传递消息。但问题是,我需要在不使用 msgget()
和 msgsnd()
我该如何实施?我可以使用什么样的技术?
有多种方法可以与子进程通信,这取决于您的应用程序。
很大程度上取决于您的应用程序的抽象级别。
-- 如果抽象层次低:
如果您需要非常的快速通信,您可以使用共享内存(例如shm_open()
)。但是正确同步会很复杂。
最常用的方法,如果我处在你的位置,我会使用的方法是:管道。
它简单、快速,并且由于 epoll()
和那些异步 I/O API 支持管道文件描述符,您可以利用这一事实。
另一个优点是,如果您的应用程序增长,并且您需要与远程进程(不在您本地机器上的进程)通信,将管道适配为套接字是非常 easy,基本上还是一样reading/writingfrom/to一个文件描述符
此外,Unix 域套接字(在其他平台中称为“命名管道”)让您拥有一个服务器进程,该进程创建一个具有众所周知名称(例如文件系统中的条目,例如作为 /tmp/my_socket
),并且 local 机器中的所有客户端都可以连接到它。
管道、网络套接字或 unix 域套接字是非常可互换的解决方案,因为 - 如前所述 - 都涉及 reading/writing 数据 from/to 文件描述符,因此您可以重用代码。
文件描述符的缺点是你正在将数据写入字节流,因此你需要自己实现消息的“消息流协议”,以“取消流”你的消息(marshalling/unmarshalling),但在大多数情况下这并不复杂,这还取决于您发送的消息类型。
我会传递其他解决方案,例如内存映射文件等。
-- 如果抽象层次更高:
您可以使用第 3 方消息传递系统,例如 RabbitMQ、ZMQ 等。