Pipes в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Pipes в Linux

Сообщение dionic »

Привет всем! Народ подскажите что я не так делаю. Ну никак не могу заставить работать pipes в linux... Вот код программы, которая просто запускает другую и передаёт ей по pipe строку, а консоль её отвечает тоже строкой...

Код: Выделить всё

// процедура нажатия на кнопку вызова консольной проги
procedure TForm1.Button2Click(Sender: TObject);
var i   : integer;
    str : ansistring;
begin
 MyProc:= TProcess.Create(nil);
 MyProc.CommandLine:='/media/DATA/MyWork/Test_projects/TProcess/ApplCl/project1';
 //MyProc.CommandLine:='D:\MyWork\Test_projects\TProcess\ApplCl\project1.exe';
 MyProc.Options:= MyProc.Options + [poUsePipes,poNewConsole];
 MyProc.Execute;
 MyProc.input.WriteAnsiString('Helffflo');

 while MyProc.Running do begin
  if MyProc.Output.NumBytesAvailable > 0 then
   str:=MyProc.Output.ReadAnsiString;
 end;

 form1.Memo1.Lines.Add(str);
 MyProc.Free;
end;         


// а это тело процедуры консольного приложения
procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
  sIn  : TInputPipeStream;
  sOut : TOutputPipeStream;
  inMsg  : ansistring;
  outMsg : ansistring;

begin
  try
   sIn := TInputPipeStream.Create(StdInputHandle);
   sOut:= TOutputPipeStream.Create(StdOutputHandle);

   inMsg:= sIn.ReadAnsiString;

   if inMsg = 'Hello' then
    outMsg:= 'Hello my friend'
   else
    outMsg:= 'What you say, my friend?';

   sOut.WriteAnsiString(outMsg);

   Terminate;
  finally
   FreeandNil(sIn);
   FreeandNil(sOut);
  end;
end;



Самое интересное , что в винде всё работает. А вот в linux ну никак не хочет принимать строку, а просто висит и всё...
wolker
незнакомец
Сообщения: 5
Зарегистрирован: 08.02.2009 21:54:45

Сообщение wolker »

Попробуй использовать FpSystem или Shell
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Тема перехвата консольного вывода поднималась уже не раз. Но судя по всему TProcess по прежнему "глючный" под Linux.
Поиск рулит :D
Перехват консольного вывода (Linux) http://www.freepascal.ru/forum/viewtopic.php?f=11&t=5356
Лучше так, имхо, запускать чужие приложения

Код: Выделить всё

uses libc;
....
libc.system(Pchar('free'))


Добавлено спустя 5 минут 35 секунд:
Ищете forkpty 8)
dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Сообщение dionic »

Ну всё немного хоть прояснилось. Попробовал вместо poNewConsole поставить poNoConsole и всё заработало...
Всем кто ответил спасибо.=)
Ответить