简单的进程间通信

Mar*_*o90 1 ipc ada

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

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

Mar*_*o90 5

这是我对自己问题的解决方案。我发现这个Ada Gem #20描述了 pragma 的用法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;
Run Code Online (Sandbox Code Playgroud)

文件: 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;
Run Code Online (Sandbox Code Playgroud)

文件: 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;
Run Code Online (Sandbox Code Playgroud)

文件: 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;
Run Code Online (Sandbox Code Playgroud)