c - C:在同时运行的 2 个不同程序之间共享结构的实例化
问题描述
我需要在 C 中制作这样的程序:
- 程序 A 启动并做一些事情。
- 等等。
- 程序 B 开始。
- B 向 A 发送数据并等待响应。
- A回复并等待B。
- B 向 A 发送数据并等待响应。
- A回复并等待B。
- 重复该过程,直到 B 没有更多数据。
当 A 启动时,它会创建一些子进程并创建一个控制块的实例。
对于 A 需要等待的部分,我认为我可以使用存储在控制块中的条件变量。当 B 开始等待时,它可以唤醒 A,以便他们可以使用管道进行通信。
我的问题是:如何使程序 A 中的控制块实例化对 B 可见?我想过使用两个程序都包含的头文件,但我认为这仅适用于控制块的可见性,而不适用于之前创建的实际实例。该问题在程序 AB 管道通信的其余部分中继续存在,因为它们需要共享管道控制块的 1 个特定实例。
解决方案只是程序 A 中的全局变量吗?
解决方案
如何使程序 A 中的控制块实例化对 B 可见?
共享内存。
细节将取决于您的操作系统和 C 实现,但这没有实际意义,因为我不建议首先朝这个方向发展。
我想过使用两个程序都包含的头文件,但我认为这仅适用于控制块的可见性,而不适用于之前创建的实际实例。
头文件通常在 C 编程中发挥重要作用,它们将在解决您的问题的共享内存解决方案中发挥作用,但您是正确的,仅包含相同的头文件不会导致两个不同的程序共享任何内存。
该问题在程序 AB 管道通信的其余部分中继续存在,因为它们需要共享管道控制块的 1 个特定实例。
为什么?整个想法似乎基于您将使用条件变量(因此也是互斥体)来同步程序活动的想法,但这似乎完全没有必要。您已经计划使用管道,它们本身就构成了一种可行的同步机制。
解决方案只是程序 A 中的全局变量吗?
不。“全局变量”,从这个术语通常在 C 上下文中使用的意义上说,仅对单个进程是全局的。它对其他进程不可见或无法访问。
你让这变得比它需要的更难。试图从管道中读取的程序(以通常的阻塞模式打开)将自动等待数据可用。您不需要任何额外的同步对象来实现这一点。
有两个主要警告:
- 对于没有额外同步对象的双向通信,通常每个方向都需要一个单独的管道。
- 对于每个大于一个字节的消息交换,您可能需要准备处理部分传输(通过进行额外的读取,直到您传输并组装了完整的消息)。这意味着您必须有一种方法来识别消息边界。
请注意,后者至少在原则上适用,即使您依赖外部同步对象也是如此。
推荐阅读
- javascript - 如何在foreach中初始化对象以推送元素
- python - 您如何管理数据框中缺少的日期?
- python - Python 3.6:查询
- python - Selenium Python:循环中间 - 陈旧元素错误
- python - 如何在python中计算大规模逆矩阵
- c# - 动态设置@Html.Textbox() 属性?
- graph-databases - Janugraph REINDEX 卡在 INSTALLED 中
- php - 使用 php 更改使用的 woocommerce 电子邮件模板(不自定义模板)
- asp.net-mvc - Visual Studio ASP.NET Web 部署 - 每个引用自定义库的页面都给出错误 404
- git - 如何解决 git push 被拒绝的错误?