首页 > 解决方案 > C:在同时运行的 2 个不同程序之间共享结构的实例化

问题描述

我需要在 C 中制作这样的程序:

当 A 启动时,它会创建一些子进程并创建一个控制块的实例。

对于 A 需要等待的部分,我认为我可以使用存储在控制块中的条件变量。当 B 开始等待时,它可以唤醒 A,以便他们可以使用管道进行通信。

我的问题是:如何使程序 A 中的控制块实例化对 B 可见?我想过使用两个程序都包含的头文件,但我认为这仅适用于控制块的可见性,而不适用于之前创建的实际实例。该问题在程序 AB 管道通信的其余部分中继续存在,因为它们需要共享管道控制块的 1 个特定实例。

解决方案只是程序 A 中的全局变量吗?

标签: csocketsstructprocesspipe

解决方案


如何使程序 A 中的控制块实例化对 B 可见?

共享内存。

细节将取决于您的操作系统和 C 实现,但这没有实际意义,因为我不建议首先朝这个方向发展。

我想过使用两个程序都包含的头文件,但我认为这仅适用于控制块的可见性,而不适用于之前创建的实际实例。

头文件通常在 C 编程中发挥重要作用,它们将在解决您的问题的共享内存解决方案中发挥作用,但您是正确的,仅包含相同的头文件不会导致两个不同的程序共享任何内存。

该问题在程序 AB 管道通信的其余部分中继续存在,因为它们需要共享管道控制块的 1 个特定实例。

为什么?整个想法似乎基于您将使用条件变量(因此也是互斥体)来同步程序活动的想法,但这似乎完全没有必要。您已经计划使用管道,它们本身就构成了一种可行的同步机制。

解决方案只是程序 A 中的全局变量吗?

不。“全局变量”,从这个术语通常在 C 上下文中使用的意义上说,仅对单个进程是全局的。它对其他进程不可见或无法访问。

你让这变得比它需要的更难。试图从管道中读取的程序(以通常的阻塞模式打开)将自动等待数据可用。您不需要任何额外的同步对象来实现这一点。

有两个主要警告:

  • 对于没有额外同步对象的双向通信,通常每个方向都需要一个单独的管道。
  • 对于每个大于一个字节的消息交换,您可能需要准备处理部分传输(通过进行额外的读取,直到您传输并组装了完整的消息)。这意味着您必须有一种方法来识别消息边界。

请注意,后者至少在原则上适用,即使您依赖外部同步对象也是如此。


推荐阅读