简单的进程间通信

     2023-02-16     301

关键词:

【中文标题】简单的进程间通信【英文标题】:Simple interprocess communication 【发布时间】:2019-04-08 17:00:07 【问题描述】:

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

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

【问题讨论】:

更新:使用 pragma Shared_Passive 的快速实验成功。 您可能会对以下有关分布式系统的文章(“Ada Gems”)感兴趣:Gem #84、Gem #85、Gem #87 和 Gem #90。这些文章提供了一些与 Ada RM 的分布式系统附件(附件 E)相关的示例。 @Marcello90 请您通过以后可以接受的答案详细说明您的解决方案。这会将问题标记为已回答,并为其他开发人员提供一种比仅仅发表评论更简单的方法来解决他们自己的问题 @FrédéricPraca 当然。 ;) 【参考方案1】:

这是我自己的问题的解决方案。我发现这个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;

【讨论】:

【参考方案2】:

我认为附件 E 可以帮助您,更准确地说是 E.2.3 Remote Call Interface Library Units。

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

【讨论】:

【参考方案3】:

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

优点:

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

缺点:

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

Florist 中要查看的包是 POSIX.Generic_Shared_MemoryPOSIX.IOPOSIX.Semaphores .

您可以在 Jacob Sparre Andersen's POSIX pages 上找到示例

【讨论】:

使用环境变量进行简单的进程间通信

】使用环境变量进行简单的进程间通信【英文标题】:Usingenvironmentvariablesforsimpleinterprocesscommunication【发布时间】:2014-04-2214:38:17【问题描述】:如果我要使用Linux环境变量作为在不同进程之间共享信息的简单方法(用Python编写... 查看详情

大型项目中进程间通信的最佳和最简单方法

】大型项目中进程间通信的最佳和最简单方法【英文标题】:BestandEasiestMethodforinter-processcommunicationinlargeproject【发布时间】:2009-04-2118:58:52【问题描述】:在一个非常大的项目中,可用于进程间通信的最佳和最简单的方法是什么... 查看详情

具有多个侦听器的简单进程间通信

】具有多个侦听器的简单进程间通信【英文标题】:SimpleInterprocess-Communicationwithmultiplelisteners【发布时间】:2014-08-2114:44:11【问题描述】:在一个项目中,我有一个控制多个子应用程序的主应用程序(C#)。这些子应用程序将使用C#... 查看详情

进程间通信

...称为IPC  进程之间的数据交换叫作进程间通信2.进程间简单通信方式:环境变量表,命令行,信号,文件(不能实时)  管道(有名管道,无名管道(只能在父子进程之间用))3.XSI通信方式:SI:系统调用接口,X:一个公... 查看详情

wpfwinform进程间通信的方式

参考技术A,如果是WinForm程序,可以通过IMessageFilter实现简单的进程间通信,发个指令还是OK的。WPF可以使用远程代理实现。 查看详情

进程间通信——管道(代码片段)

...的一大重要方式,平时应用当中十分广泛。于是这里就先简单整理了一些关于管道的用法和注意事项。匿名管道管道是UNIX中最古老的进程间通信形式。通常将一个进程连接到另一个进程的一个数据流称为一个“管道”。它... 查看详情

进程之间的通信

一、基本概念    进程间通信IPC:进程之间交换数据的过程叫进程间通信    进程间同性的方式:        简单的进程间的通信:          查看详情

最兼容的进程间通信协议

...用程序是用C#编写的,APIDLL将是相同的。最初我的想法是简单地使用WCF和命名管道,因为它将提供一种非常简单的方法来编写整个接口 查看详情

实验8进程间通信

...行进程通信。2.举例说明使用mkfifo命令创建命名管道以及简单演示管道如何工作。3.编写两个程序使用第2题中创建的管道进行通信。4.编写两个程序分别通过指定的 查看详情

实验八进程间通信

...匿名管道:2、举例说明使用mkfifo命令创建命名管道以及简单演示管道如何工作命名管道:3、编写两个程序使用第2题中创建的管道进行通信pipe_send.c:pipe_ 查看详情

第七课进程通信

...间进行数据交换的过程。2.进程间通信分类~~~~~~~~~~~~~~~~~1)简单进程间通信:命令行参数、环境变量 查看详情

kotlin简单实现aidl进程间通信(代码片段)

上一篇:java简单实现AIDL进程通信,是java版的,现在写一篇kotlin的。具体步骤和上篇文章一样,我直接贴代码。服务端NameServiceclassNameService:Service()overridefunonBind(intent:Intent):IBinder?returnServiceStub()classServic 查看详情

kotlin简单实现aidl进程间通信(代码片段)

上一篇:java简单实现AIDL进程通信,是java版的,现在写一篇kotlin的。具体步骤和上篇文章一样,我直接贴代码。服务端NameServiceclassNameService:Service()overridefunonBind(intent:Intent):IBinder?returnServiceStub()classServic 查看详情

C++中的进程间通信

...C++【发布时间】:2009-08-2720:40:15【问题描述】:我有一个简单的C++应用程序,可以在我的Web应用程序的后端生成报告(简单的LAMP设置)。问题是后端加载了一个需要大约1.5GB内存的数据文件。如果多个用户同时运行它,这将不会... 查看详情

什么是最简单的进程间通信方法 - 跨任何操作系统和语言

】什么是最简单的进程间通信方法-跨任何操作系统和语言【英文标题】:WhatisthesimplestmethodforInterprocessCommunication-acrossanyO/S&language【发布时间】:2011-09-1720:06:49【问题描述】:对于编程竞赛(codewar),我想将其设置为将游戏状态... 查看详情

进程间通信方式总结

一、简单的进程间通信  1.命令行参数:argcargv;  2.环境变量  3.信号signal      signal信号机制是属于计算机异常处理机制中的一种。    signal信号属于一种异步处理异常的机制之一。    不可靠信号:... 查看详情

linux学习:进程间通信—管道

1、进程间通信当中一种比較简单的方法是管道操作/*============================================================================Name:Test.cAuthor:wangchuanVersion:Copyright:YourcopyrightnoticeDescription:HelloWorldinC,Ansi-styl 查看详情

“松散”的进程间通信

...有其他程序的情况下运行,并且可以协同工作。什么是最简单和/或最好(最有效)的IPC解决方案/方法?【问题讨论】:每个程序能否发现 查看详情