[fpc-devel] Changes to TProcess

Michael Van Canneyt michael at freepascal.org
Wed Jan 3 14:28:54 CET 2024


Hello,

I merged a significant evolution of the TProcess component to FPC trunk.

Until recently, there were 2 options for TProcess when starting a new
process:

- use the parent process standard input/output/error
- use pipes to make the standard input/output/error available as streams in the parent process.

This has been enhanced with the following new possibilities:

- For the new process, the standard input/output/error can be configured separately.

- You can specify a filename as input/output/error.
   (additionally, you can rewrite or append to the file in case of output)

- You can specify a custom I/O handle as input/output/error
   (e;g. at least on unix, you can pass a socket handle)

- You can specify the null file (/dev/null on unixes or NULL on windows)

- You can specify another TProcess instance.

The last option means that you can now chain processes, just as the command shell does.

So the equivalent of the following chain of commands:

command <input.txt | sed s/delphi/FPC/g > file.txt

would then be

   Proc.Executable:='command';
   Proc.InputDescriptor.FileName:='input.txt';
   Proc2.Executable:='sed';
   Proc2.Parameters.Add('s/delphi/FPC/g');
   Proc2.OutputDescriptor.FileName:='file.txt';
   Proc.OutputDescriptor.Process:=Proc2;
   Proc2.Execute;
   Proc.execute;

Needless to say, the component remains backwards compatible.

There is now a testsuite for the TProcess command, so everything was tested.
but nothing beats testing in the wild, so I would appreciate it if people
could test it and provide feedback.

Enjoy,

Michael.


More information about the fpc-devel mailing list