简单的进程间通信



我想知道 Ada 提供了哪些功能来实现两个正在运行的可执行文件(不是任务(之间的(简单(进程间通信形式?我假设这两个可执行文件都是用 Ada 编写的。

假设一个可执行文件a定期从传感器读取数据,而另一个可执行文件有兴趣以固定间隔处理这些值b。我认为包Ada.Streams.Stream_IO可用于序列化传感器数据并将其写入文件,但我不确定如何同步写入(第一个可执行文件(和读取(第二个可执行文件(操作。Shared_Passive可以使用编译指示来解决此类问题吗?

这是我对自己问题的解决方案。我发现这个 Ada Gem #20 描述了编译指示Shared_Passive的用法。GNAT 参考手册提供了更详细的信息。

以下源代码演示了在编写器和传感器程序之间交换随机生成的传感器数据。

文件: memory.ads

package Memory is
   pragma Shared_Passive;
   type Sensor_Storage_Type is
      record
         Sequence_Numer : Natural := 0;
         Humidity       : Float   := 0.0;
      end record;
   protected Shared is
      function Read return Sensor_Storage_Type;
      procedure Write (Humidity : Float);
   private
      Current_Value : Sensor_Storage_Type;
   end Shared;
end Memory;

文件: memory.adb

package body Memory is
   protected body Shared is
      function Read return Sensor_Storage_Type is
      begin
         return Current_Value;
      end Read;
      procedure Write (Humidity : Float) is
      begin
         Current_Value.Sequence_Numer := Current_Value.Sequence_Numer + 1;
         Current_Value.Humidity := Humidity;
      end Write;
   end Shared;
end Memory;

文件: sensor_writer.adb

with Ada.Text_IO;
with Ada.Numerics.Float_Random;
with Memory;
procedure Sensor_Writer is
   Generator : Ada.Numerics.Float_Random.Generator;
   package Float_IO is new Ada.Text_IO.Float_IO (Num => Float);
   Random_Humidity : Float;
begin
   while True loop
      Random_Humidity := Ada.Numerics.Float_Random.Random (Generator) * 100.0;
      Memory.Shared.Write (Random_Humidity);
      Ada.Text_IO.Put ("Wrote sensor value: ");
      Float_IO.Put (Random_Humidity, Exp => 0);
      Ada.Text_IO.New_Line;
      delay 5.0;
   end loop;
end Sensor_Writer;

文件: sensor_reader.adb

with Ada.Text_IO;
with Memory;
procedure Sensor_Reader is
   Sensor_Value : Memory.Sensor_Storage_Type;
begin
   while True loop
      Sensor_Value := Memory.Shared.Read;
      Ada.Text_IO.Put_Line ("Read sensor values:");
      Ada.Text_IO.Put_Line ("    Sequence number: " & Sensor_Value.Sequence_Numer'Image);
      Ada.Text_IO.Put_Line ("    Humidity: " & Sensor_Value.Humidity'Image);
      delay 1.0;
   end loop;
end Sensor_Reader;
我认为附录 E

可以帮助您,更准确地说,是 E.2.3 远程调用接口库单元。

只是,请记住,并非所有编译器都实现 Annexe 规范。 GNAT 确实如此,但对于其他编译器,我不知道。

在进程之间进行 IPC 的另一种解决方案是使用在 Florist 中实现的旧 POSIX IPC,例如信号共享内存管道(我没有在 Adacore 网站上找到 Florist,所以我想知道这是否仍然保持(。

优点 :

  • 使两个程序在没有网络堆栈的情况下相互通信
  • 程序可以是不同的语言
  • POSIX 操作系统上的标准

缺点 :

  • 相当低级的编程
  • 需要使用信号量手动进行同步

花店中要查看的软件包是POSIX。Generic_Shared_Memory波西斯。IOPOSIX。信号量

您可以在Jacob Sparre Andersen的POSIX页面上找到示例

最新更新