【问题标题】:C: Share an instantiation of a struct between 2 different programs that run at the same timeC:在同时运行的 2 个不同程序之间共享结构的实例化
【发布时间】:2019-12-27 14:51:14
【问题描述】:
我需要在 C 中编写这样的程序:
- 程序 A 启动并执行一些操作。
- 等待。
- 程序 B 启动。
- B 向 A 发送数据并等待响应。
- A 回复并等待 B。
- B 向 A 发送数据并等待响应。
- A 回复并等待 B。
- 该过程一直重复,直到 B 没有更多数据。
当 A 启动时,它会创建一些子进程并创建一个控制块的实例。
对于 A 需要等待的部分,我认为我可以使用存储在控制块中的条件变量。当 B 开始等待时,它可以唤醒 A,以便他们可以使用管道进行通信。
我的问题是:如何使程序 A 中的控制块实例化对 B 可见?
我想过使用两个程序都包含的头文件,但我认为这仅适用于控制块的可见性,而不适用于之前创建的实际实例。该问题在程序 A-B 管道通信的其余部分中继续存在,因为它们需要共享管道控制块的 1 个特定实例。
解决方案只是程序 A 中的一个全局变量吗?
【问题讨论】:
标签:
c
sockets
struct
process
pipe
【解决方案1】:
如何使程序 A 中的控制块实例化可见
给B?
共享内存。
细节取决于您的操作系统和 C 实现,但这没有实际意义,因为我不建议一开始就朝这个方向发展。
我想过使用一个头文件来包含在两个程序中
但我认为这只适用于控制块的可见性
而不是之前创建的实际实例。
头文件通常在 C 编程中发挥重要作用,它们在解决您的问题的共享内存解决方案中发挥作用,但您是正确的,仅包含相同的头文件不会导致两个不同的程序共享任何记忆。
那个
问题在程序 A-B 管道通信的其余部分继续存在
因为他们需要共享管道控制块的 1 个特定实例。
为什么?整个想法似乎是基于您将使用条件变量(因此也是互斥体)来同步程序活动的想法,但这似乎完全没有必要。您已经在计划使用管道,它们本身就构成了一种可行的同步机制。
解决方案只是程序 A 中的一个全局变量吗?
没有。一个“全局变量”,在这个术语通常在 C 上下文中使用的意义上,仅对单个进程是全局的。它对其他进程不可见或无法访问。
你让这变得比它需要的更难。试图从管道(以通常的阻塞模式打开)读取的程序将自动等待数据可用。您不需要任何额外的同步对象来实现这一点。
有两个主要的警告:
- 对于没有额外同步对象的双向通信,您通常需要为每个方向使用单独的管道。
- 对于每个大于一个字节的消息交换,您可能需要准备处理部分传输(通过进行额外的读取,直到您传输并组装了完整的消息)。这意味着您必须有一种方法来识别消息边界。
请注意,后者至少在原则上适用,即使您依赖外部同步对象。