Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirecting stdout of one process object to stdin of another

Tags:

c#

ipc

How can I set up two external executables to run from a c# application where stdout from the first is routed to stdin from the second?

I know how to run external programs by using the Process object, but I don't see a way of doing something like "myprogram1 -some -options | myprogram2 -some -options". I'll also need to catch the stdout of the second program (myprogram2 in the example).

In PHP I would just do this:

$descriptorspec = array(
            1 => array("pipe", "w"),  // stdout
        );

$this->command_process_resource = proc_open("myprogram1 -some -options | myprogram2 -some -options", $descriptorspec, $pipes);

And $pipes[1] would be the stdout from the last program in the chain. Is there a way to accomplish this in c#?

like image 971
Matthew Avatar asked Dec 23 '22 09:12

Matthew


1 Answers

Here's a basic example of wiring the standard output of one process to the standard input of another.

Process out = new Process("program1.exe", "-some -options");
Process in = new Process("program2.exe", "-some -options");

out.UseShellExecute = false;

out.RedirectStandardOutput = true;
in.RedirectStandardInput = true;

using(StreamReader sr = new StreamReader(out.StandardOutput))
using(StreamWriter sw = new StreamWriter(in.StandardInput))
{
  string line;
  while((line = sr.ReadLine()) != null)
  {
    sw.WriteLine(line);
  }
}
like image 119
scottm Avatar answered Jan 14 '23 03:01

scottm