【问题标题】: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 上下文中使用的意义上,仅对单个进程是全局的。它对其他进程不可见或无法访问。

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

    有两个主要的警告:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2017-10-19
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多