Delphi Linux и создание серверных приложений – постскриптум

by Jun 13, 2017

8 июня прошел первый вебинар Embarcadero, на котором мы начали знакомить с возможностями Delphi for Linux из RAD Studio 10.2.

Запланированного практического материала было так много, что мы не успели рассмотреть один из важных вопросов. Договорились рассмотреть его на следующем вебинаре по Delphi Linux. Ну, а все, что успели, записано на видео и доступно для просмотра на Youtube-канале Embarcadero Russia. Примеры, хотя они и были очень простые и понятные, доступны в виде исходных текстов на сайте GitHub.

Запись: https://youtu.be/92jPG0GXZmM  

Примеры: https://goo.gl/W7i9VY  

Несмотря на большое разнообразие вариантов серверных Linux, основные универсальные функции API уже включены в поставку RAD Studio, часть остальных появится в поставке версии 10.2.1, которую можно получить по подписке. Если необходимо применение функций из дополнительных библиотек, то это возможно и сейчас.

Как мне показалось, в соответствующем примере на вебинаре было слишком много лишних строк кода. Поэтому ниже вы найдете сокращенный и понятный вариант примера вызова команд Linux и возврата потока (Pipe) результата в программу без лишних комментариев и процедур:

program MyCmdPipe;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils,
  Posix.Base,Posix.Fcntl;

type
  TStreamHandle = pointer;

///  
///    Man Page: http://man7.org/linux/man-pages/man3/popen.3.html
///  
function popen(const command: MarshaledAString; const _type: MarshaledAString): TStreamHandle; cdecl; external libc name _PU + 'popen';
function pclose(filehandle: TStreamHandle): int32; cdecl; external libc name _PU + 'pclose';
function fgets(buffer: pointer; size: int32; Stream: TStreamHAndle): pointer; cdecl; external libc name _PU + 'fgets';

var
  Handle: TStreamHandle;
  LBuffer: TBytes;
  FileText: string;
begin
  try
    SetLength(LBuffer, 2048);
    LBuffer[pred(length(LBuffer))]:=0;
    Handle := popen('/bin/ps -axjf | grep sbin','r');
    try
      while fgets(@LBuffer[0],pred(Length(LBuffer)),Handle)<>nil do begin
        FileText:=UTF8ToString(Pointer(Lbuffer));
        Write(FileText);
      end;
    finally
      pclose(Handle);
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end. 

 Вот так просто, и даже с поддержкой русского текста, хотя по сравнению с первоисточником (пример Craig Chapman в архиве с примерами) есть ряд изменений.

Еще есть ряд идей, которые хотелось бы развить. 

В обсуждении по окончании вебинара прозвучал ряд вопросов о доступности инструментов развертывания и отладки в разных отечественных вариантах Linux и предложение о совместном исследовании этого вопроса. Если у вас есть желание и возможность оценить RAD Studio 10.2 с тем или иным отечественным вариантом, мы будем рады получить и обсудить результаты ваших тестов, оценки и предложения по улучшению. И, конечно, мы всегда готовы  помочь найти ответы на любые ваши вопросы по технологиям Embarcadero.