我想知道Ada提供哪些功能来实现两个正在运行的可执行文件(不是任务)之间的(简单)形式的进程间通信?我假设两个可执行文件都是用Ada编写的。
想象一个可执行文件以固定间隔a
从传感器读取数据,而另一个可执行文件则有兴趣以固定间隔b
处理这些值。我认为可以使用包Ada.Streams.Stream_IO
来序列化传感器数据并将其写入文件,但是我不确定写入(第一个可执行文件)和读取(第二个可执行文件)操作如何同步。可以使用实用语Shared_Passive
解决此类问题吗?
答案 0 :(得分:4)
这是我对自己的问题的解决方案。我发现此Ada Gem #20描述了实用注释Shared_Passive
的用法。 《 GNAT参考手册》提供了更多detailed information。
以下源代码演示了编写器和传感器程序之间随机生成的传感器数据的交换。
文件: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;
答案 1 :(得分:1)
我认为附件E可以更准确地帮助您E.2.3 Remote Call Interface Library Units。
请记住,并非所有编译器都实现Annexe规范。 GNAT可以,但是对于其他编译器,我不知道。
答案 2 :(得分:0)
在进程之间进行IPC的另一种解决方案是使用良好的旧POSIX IPC,例如 semaphores , shared memory 和 pipes {3}}(我在Adacore网站上没有找到 Florist ,所以我想知道是否仍在维护该问题)。
优点:
缺点:
要在 Florist 中查看的软件包是 POSIX.Generic_Shared_Memory , POSIX.IO 和 POSIX.Semaphores
您会在Florist
上找到示例