pipe — передача в / из программы Ada в программу C ++

Раньше я использовал каналы в C / C ++, но я работаю над настройкой канала в каком-то устаревшем коде Ada … однако я все еще нахожусь в фазе «изучения» с Ada, и я еще многое еще не знаю ,

При этом я пытался выяснить, как настроены каналы в Аде & как их использовать. Пока я нашел только эти статьи:

  1. Толстая привязка Ada 95 для дочерних процессов и труб Unix
  2. Пакет: Util.Pipes
  3. Трубы — ада-ути.

Не поймите меня неправильно, у них много хороших знаний, но 1 ориентирован на Ada95 (у меня есть возможность компилировать до Ada05), 2 просто перечисляет функции, & 3 предлагает мало способов объяснения.

Кто-нибудь знает учебник для Ada трубы? Или, что еще лучше, может кто-нибудь привести пример того, как реализовать простой канал в Аде?

Я понимаю, что это не самый идеальный вопрос, но у меня заканчиваются «Google Combination» …

2

Решение

Вы можете быть более заинтересованы в потоках — http://en.wikibooks.org/wiki/Ada_Programming/Input_Output/Stream_Tutorial

Тем более, что если вы создаете пакет, который связывает поток с каналом, вы получаете бесплатный доступ с помощью Type_Name’Read (stream, object) & Type_Name’Write (поток, объект).

3

Другие решения

Скомпилировано в Windows 10 с GNAT GPL 2015

with Ada.Text_IO;
with System;
with Interfaces.C;

procedure Main is

package Pipes is
type Pipe is private;
type Get_Result is private;
function Open_Read (Command : String) return Pipe;
procedure Close (Stream : Pipe);
function Get (Stream : Pipe) return Get_Result;
function End_Of_File (Item : Get_Result) return Boolean;
function To_Ada (Item : Get_Result) return Character;
private
use System;
use Interfaces.C;
type Pipe is new Address;
type Get_Result is new int;
end;

package body Pipes is
function popen (command : char_array; mode : char_array) return Address with Import, Convention => C, External_Name => "popen";
function pclose (stream : Address) return int with Import, Convention => C, External_Name => "pclose";
function fgetc (stream : Address) return int with Import, Convention => C, External_Name => "fgetc";
function Open_Read (Command : String) return Pipe is
Mode : constant char_array := "r" & nul;
Result : Address;
begin
Result := popen (To_C (Command), Mode);
if Result = Null_Address then
raise Program_Error with "popen error";
end if;
return Pipe (Result);
end;
procedure Close (Stream : Pipe) is
Result : int;
begin
Result := pclose (Address (Stream));
if Result = -1 then
raise Program_Error with "pclose error";
end if;
end;
function Get (Stream : Pipe) return Get_Result is
begin
return Get_Result (fgetc (Address (Stream)));
end;
function End_Of_File (Item : Get_Result) return Boolean is (Item = -1);
function To_Ada (Item : Get_Result) return Character is (Character'Val (Get_Result'Pos (Item)));
end;

procedure Test is
use Ada.Text_IO;
use Pipes;
P : Pipe;
C : Get_Result;
begin
P := Open_Read ("netstat");
loop
C := Get (P);
exit when End_Of_File (C);
Put (To_Ada (C));
end loop;
Close (P);
end;

begin
Test;
end;

Вывод будет отличаться от пользователя к пользователю.

Active Connections

Proto  Local Address          Foreign Address        State
TCP    192.168.1.140:49698    stackoverflow:https    ESTABLISHED
TCP    192.168.1.140:49874    stackoverflow:https    ESTABLISHED
TCP    192.168.1.140:49915    stackoverflow:https    TIME_WAIT
TCP    192.168.1.140:49916    stackoverflow:https    TIME_WAIT
2

Ада языку нечего сказать на тему труб; они не являются частью стандартной библиотеки. Я подозреваю, что то же самое верно для C ++ и библиотеки Boost (не то, чтобы я был пользователем); трубы являются объектом операционной системы.

Ваш Статья 1 содержит исходный код, который компилируется и работает с Ada 2005 и Ada 2012, а также (я ожидаю) Ada 95 — во всяком случае, в системах Unix. Не так ли?

Ваша статья 2 — скорее, Util пакет найти, ковыряясь немного — говорит, что работает на Windows и Unix.

Программное обеспечение, доступное в вашей статье 3, имеет большое преимущество в обслуживании!

Что касается учебника — так как каналы не в стандарте, вы должны использовать то, что предоставили люди, которые написали конкретную библиотеку, которую вы выбрали. Статьи 1 и 3 содержат демонстрационные программы (я не проверял статью 2). Я подозреваю, что это все!

1

Это может быть немного перепроектировать, но есть gnat.sockets если вам разрешено использовать библиотеки gnat.

В конце концов, канал — это более простая версия сокета (или сокет, являющийся расширенной версией канала), оба позволяют передавать данные между задачами / процессами.

1

Если вы хотите использовать каналы Unix в приложении Ada, вы должны рассмотреть POSIX Ada API, поскольку это формальный стандарт. Одной из реализаций этого является библиотека «FLORIST».

Языковой сервер Crimeville пример того, как вы можете использовать каналы для обработки связи между приложением Ada и унаследованным приложением с дружественным к каналу интерфейсом.

0