如何在 Ada 中使用 Linux 将任意字符串写入并读取到共享内存?

Posted

技术标签:

【中文标题】如何在 Ada 中使用 Linux 将任意字符串写入并读取到共享内存?【英文标题】:How do I write and then read an arbitrary string to shared memory using Linux in Ada? 【发布时间】:2018-08-06 16:56:37 【问题描述】:

我是 Ada 的初学者,网上的大部分资源都是 C 语言的,我很难翻译成 Ada。

我应该将 SysV shm 与 shmget 和 shmat 一起使用,还是应该将 POSIX shm 与 mmap 和 shm_open 一起使用?

你能给我一个包含这两个过程(先写,然后读)的 Ada 程序的例子吗?例如,假设我想写然后读字符串“Butterflies”。

谢谢一百万!

【问题讨论】:

希望对您有帮助:***.com/questions/10810984/… 问题是关于ADA,而不是C,所以请去掉C标签 【参考方案1】:

有几种方法可以做到这一点。也许最简单的是内存覆盖。假设您保留了一块内存$3300$33FF,您可以使用$3300 处的字节来指示字符串的长度,$3301..$33FF 作为内容字符串。

With Interfaces;
    Package ShortString is
        Type String( Length : Interfaces.Unsigned_8 ) is private;

        -- Convert a shortstring to a standard string.
        Function "+"( Input : String ) Return Standard.String;

        -- Convert a standard string to a short-string.
        Function "+"( Input : Standard.String ) Return String
          with Pre => Input'Length <= Positive(Interfaces.Unsigned_8'Last);

        Private

        -- Declare a Positive subtype for a byte.
        Subtype Positive is Interfaces.Unsigned_8 range 1..Interfaces.Unsigned_8'Last;

        -- Use the byte-sized positive for indexing the short-string.
        Type Internal is Array(Positive range <>) of Character;

        -- Declare a varying-length record for the short-string implementation.
        Type String( Length : Interfaces.Unsigned_8 ) is record
            Data : Internal(1..Length);
        end record;

        -- We must ensure the first byte is the length.
        For String use record
          Length at 0 range 0..7;
        end record;

        Function "+"( Input : String ) Return Standard.String is
          ( Standard.String(Input.Data) );

        Function "+"( Input : Standard.String ) Return String is
          ( Length => Interfaces.Unsigned_8(Input'Length),
            Data   => Internal( Input )
          );
    End ShortString;

那么对于内存覆盖:

Overlayed_String : ShortString.String(255)
  with Import, Address => System.Storage_Elements.To_Address( 16#3300# );

【讨论】:

以上是关于如何在 Ada 中使用 Linux 将任意字符串写入并读取到共享内存?的主要内容,如果未能解决你的问题,请参考以下文章

Ada - (Streams) 如何在事先不知道字符串长度的情况下正确调用 String'Read()

在 Ada 中,如何将当前时间(以秒为单位)作为可以打印出来并执行操作的值?

Ada95:如何在指数中使用浮点数?

Ada 在 Linux Mint 中因“未在此系统上安装编译器”而失败

从 Ada 调用 scanf

Linux通配符(*?[]{}!)