[Mono-devel-list] System.Diagnostics.Process redirection
John Bailo
jabailo at texeme.com
Sun Jul 3 11:45:37 EDT 2005
On Sunday 03 July 2005 06:10, Colin JN Breame wrote:
> Hello,
>
> Below is a program that on my system replicates an unexpected exit by the
> mono runtime.
>
> The lines of interest are:
>
> stdout.WriteLine("1");
> p.StandardInput.WriteLine("hello world!");
> stdout.WriteLine("2");
>
> As the program runs, it prints '1' but exit before '2' is printed
>
1. Have you tried adding a catch so you can see any errors that might be
thrown? You have that code nested in a try -- but no cache.
2. Have you stepped it through monodevelop?
3. I know from Windows .NET that the methods for monitoring the state, and
completion of a Process is somewhat ill-defined. Yes, there are several
sample code examples but some say different things. For a project I did
that send an lpr command, I ended up doing two things.
Set a new Process equal to the actual process and monitor that as a kind of
"handle". Two, put in a Thread.Sleep to give process a chance to "clean
up". There seems to be some long disconnect between when the process
'stops' and when it 'really stops'.
At least that has been my experience w/Windows.NET
> .
>
> Any ideas what might be going on here? Could this be SIGPIPE related?
>
> -- Colin
>
> ps. mono 1.1.8.1
>
>
>
> using System;
> using System.IO;
> using System.Diagnostics;
>
> public class main_t {
>
> public static void Main() {
> while (true) {
> run();
> }
> }
>
> public static void run() {
> Process p = null;
>
> try {
> p = new Process();
>
> string pipe = "echo hello";
>
> int i = pipe.IndexOf(' ');
> if (i == -1) {
> p.StartInfo.FileName = pipe;
> } else {
> p.StartInfo.FileName = pipe.Substring(0,
> i); p.StartInfo.Arguments = pipe.Substring(i+1, pipe.Length-i-1);
> }
>
> p.StartInfo.UseShellExecute = false;
> p.StartInfo.RedirectStandardInput = true;
> try {
> p.Start();
> } catch (Exception e) {
> Console.Error.WriteLine("could not execute:
> {0}", pipe);
> goto init_error;
> }
>
> TextWriter stdout = Console.Out;
> Console.SetOut(p.StandardInput);
> stdout.WriteLine("1");
> p.StandardInput.WriteLine("hello world!");
> stdout.WriteLine("2");
> Console.SetOut(stdout);
>
> p.StandardInput.Close();
>
> if (p != null) {
> p.WaitForExit();
> }
>
> } finally {
> if (p != null) p.Close();
> }
> init_error:;
> }
> }
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
More information about the Mono-devel-list
mailing list