[Lazarus] Run 3 extrenal program, pipeline

Terry A. Haimann terry at HaimannOnline.com
Thu Feb 2 13:45:05 CET 2012


All you should have to do is have each program read from stdin & write 
to stdout.  I've done it before.  There is no reason to write it in 
Lazarus at all, just use FreePascal.  If you are trying to execute this 
all from a tprocess, be aware that this in't bash.  I would put it in a 
script and try it there.

On 02/02/2012 06:00 AM, xmldom at seznam.cz wrote:
> Hi, I need run 3 external program and redirected output: first | second | third
>
> For example:
>     df -hT | grep -v -E 'tmpfs|ecryptfs' | grep 'sda2'
> it gives
>     /dev/sda2     ext4     19G   11G  7,6G  58% /
>
> I use this http://wiki.lazarus.freepascal.org/Executing_External_Programs#How_to_redirect_output_with_TProcess sample code. It works fine for  first | second.
>
> For three programs I try edit it:
>
>
> function threePipe(inputA, inputB, inputC: string): string;
> var
>   FirstProcess, SecondProcess, ThirdProcess: TProcess;
>   Buffer: array[0..127] of char;
>   ReadCount: Integer;
>   ReadSize: Integer;
> begin
>   FirstProcess  := TProcess.Create(nil);
>   SecondProcess := TProcess.Create(nil);
>   ThirdProcess := TProcess.Create(nil);
>
>   FirstProcess.Options  := [poUsePipes];
>   SecondProcess.Options := [poUsePipes];
>   ThirdProcess.Options  := [poUsePipes,poStderrToOutPut];
>
>   FirstProcess.CommandLine  := inputA;
>   SecondProcess.CommandLine := inputB;
>   ThirdProcess.CommandLine := inputC;
>
>   FirstProcess.Execute;
>   SecondProcess.Execute;
>   ThirdProcess.Execute;
>
>   while FirstProcess.Running or (FirstProcess.Output.NumBytesAvailable>  0) do
>   begin
>     if FirstProcess.Output.NumBytesAvailable>  0 then
>     begin
>       ReadSize := FirstProcess.Output.NumBytesAvailable;
>       if ReadSize>  SizeOf(Buffer) then
>         ReadSize := SizeOf(Buffer);
>       ReadCount := FirstProcess.Output.Read(Buffer[0], ReadSize);
>       SecondProcess.Input.Write(Buffer[0], ReadCount);
>     end;
>   end;
>   SecondProcess.CloseInput;
>
>   while SecondProcess.Running or (SecondProcess.Output.NumBytesAvailable>  0) do
>   begin
>     if SecondProcess.Output.NumBytesAvailable>  0 then
>     begin
>       ReadSize := SecondProcess.Output.NumBytesAvailable;
>       if ReadSize>  SizeOf(Buffer) then
>         ReadSize := SizeOf(Buffer);
>       ReadCount := SecondProcess.Output.Read(Buffer[0], ReadSize);
>       ThirdProcess.Input.Write(Buffer[0], ReadCount);
>     end;
>   end;
>   ThirdProcess.CloseInput;
>
>
>   while ThirdProcess.Running do
>     Sleep(1);
>   ReadSize := ThirdProcess.Output.NumBytesAvailable;
>   if ReadSize>  SizeOf(Buffer) then
>     ReadSize := SizeOf(Buffer);
>   if ReadSize>  0 then
>   begin
>     ReadCount := ThirdProcess.Output.Read(Buffer, ReadSize);
>     //WriteLn(Copy(Buffer,0, ReadCount));
>   end
>   else
>     WriteLn('grep did not find what we searched for. ', ThirdProcess.ExitStatus);
>
>   FirstProcess.Free;
>   SecondProcess.Free;
>   ThirdProcess.Free;
>   threePipe := Copy(Buffer,0, ReadCount);
> end;
>
>
>
> But after i call
>     Label1.Caption:=threePipe('df -hT', 'grep -v -E ''tmpfs|ecryptfs''', 'grep ''sda2''');
> function my application end with infinite loop.
>
> Where I do an error?
>
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>





More information about the Lazarus mailing list