Redirecting Standard Input/Output using the Process Class

原创 2001年12月25日 09:21:00
Redirecting Standard Input/Output using the Process Class
Submitted By User Level Date of Submission
Edwin Lima Beginner 12/18/2001

Source Code: System.Diagnostic.ProcessCode.zip

When a program starts, a new process (a program in execution) is created by the operating system, and this process is identified by its process Id and also a name. A set of counters are set attached to this process by the OS in order to have some statistics about it.

In .NET, the process component is used to start a new process or even kill or suspend an existing one. Also we can get some statistics about the process already running through the following properties:.

NonpagedSystemMemorySize:
PagedMemorySize:
PagedSystemMemorySize:
PeakPagedMemorySize:
PeakVirtualMemorySize:
PeakWorkingSet
PriorityClass
PrivateMemorySize
PrivilegedProcessorTime

The process component offers static and instance methods. Some very important static methods are:

EnterDebugMode: Put the process in debugging for interaction with the OS.
GetCurrentProcess: Returns the current running process.
GetProcessById: Returns a process instance of an existing process receiving as parameter the process id.
GetProcesses: Returns an array of Process instances of the currently running process in the host machine .
Start: Starts a new process.

The Process Class Methods: 
Close: Frees the resources associated with an instantiated process component.
Kill: Terminates a running process
CloseMainWindow: Close a process which a main windows by sending a message to its main window.

The Process Class Properties: 

Responding: Gets a value about the current status of a process: true for running false for not Responding.
StandardError: Gets a file descriptor for the standard error in order to be able to redirect to a normal Stream Reader and read as a file..
StandardInput: Gets the standard input of the process as file descriptor in order to be able to redirect and write to it as if writing to a StremWriter.
StandardOutput; Similir as the Standard error but used to read the standard output of the process.
StartInfo: This property has to be set with a ProcessStartInfo instance to pass initialization parameters to the process, before it starts. Altering this process after starting a process has no effect.

The list of properties and methods above show is not exhaustive, you can find some other ones through the help online.

In this example I'll try to illustrate some of the power of this component by starting a normal process (windows app) or also by redirecting the standard error, output and input of a DOS app. Also, you will see how to execute DOS commands by using the process component. You can also extend the example by 
reading some of the counters associated to a process and showing them in a window, like the Task Manager app. The let's see the example and some important details about it:

First of all we need to instantiate a ProcessStartInfo class passing as a constructor param the name of the app that we want to launch and to set some parameters to be passed to the Process instances (p):

ProcessStartInfo psI = new ProcessStartInfo("cmd");


The property psI.UseShellExecute was set as false, to be able to redirect the StandardInput, etc. After that, the properties

psI.RedirectStandardInput
psI.RedirectStandardOutput
psI.RedirectStandardError

...are set to true.

To avoid the cmd annoying window we set as true the property psI.CreateNoWindow so no window will be created for the cmd app.Finally we set the p.StartInfo property to the instance of ProcessStartInfo 
that we have just created and voila , starts the process.

To be able to capture the p.StandardInput, p.StandardOutput and p.StandardError we get the File Descriptors (StreamReaders and StreamWriter classes) to read the StandardOutput and StandardError and to write to the StandardInput. The read and write operations are performed as we do it in a normal file. (Hmm, does this way of working with the IO remind you the unix world?) The process cmd is closed when we close the p.StandardInput file descriptor.

At the very end we read the p.StandardOutput and p.StandardError file descriptors into the text box. See the complete code of the method that implements the whole stuff.

private void start()
{
Process p = new Process();
StreamWriter sw;
StreamReader sr;
StreamReader err;



ProcessStartInfo psI = new ProcessStartInfo("cmd");
psI.UseShellExecute = false;
psI.RedirectStandardInput = true;
psI.RedirectStandardOutput = true;
psI.RedirectStandardError = true;
psI.CreateNoWindow = true;
p.StartInfo = psI;


p.Start();
sw = p.StandardInput;
sr = p.StandardOutput;
err = p.StandardError;



sw.AutoFlush = true;
if (tbComm.Text != "")
sw.WriteLine(tbComm.Text);
else
//execute default command
sw.WriteLine("dir //");


sw.Close();

textBox1.Text = sr.ReadToEnd();
textBox1.Text += err.ReadToEnd();

}







About the Author:Edwin Lima is a software engineer working for NEC Computers International BV in the Netherlands. Most of his time he's busy with data integration tasks and in his free time he plays around with C# and .NET related stuff (You can contact me at: edwinlima@hotmail.com)

Redirecting Standard Input/Output using the Process Class

2001年12月25日 09:21:00 Redirecting Standard Input/Output using the Process Class Submitted ByUser Leve...
  • softart
  • softart
  • 2007年10月27日 12:34
  • 221

Redirecting Standard Input/Output using the Process Class铪

Redirecting Standard Input/Output using the Process Class Submitted ByUser LevelDate of Submission...
  • hejishan
  • hejishan
  • 2008年03月11日 10:03
  • 176

Redirecting standard input and output

Redirecting standard input and output - 2.0 > Many CLI programs use a feature called input/output r...
  • geekster
  • geekster
  • 2013年04月28日 16:50
  • 615

使用命令重定向操作符 (Redirection Operators)

 使用命令重定向操作符 (Redirection Operators)可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置即为句柄。下表列出了可用于将命令输入...
  • i_like_cpp
  • i_like_cpp
  • 2008年04月15日 15:52
  • 586

The 3rd ACM-ICPC Summer Training Contest(swjtu)

Problem A. Learning to Add Input file: Standard input Output file: Standard output Time limit: See ...
  • zhulei19931019
  • zhulei19931019
  • 2014年07月25日 17:35
  • 431

IPO(INPUT PROCESS OUTPUT)图

     在计算机领域IPO是指结构化设计中变换型结构的输入(Input)、加工(Processing)、输出(Output)。     IPO是对每个模块进行详细设计的工具,它是输入加工输出(Inp...
  • tianzengyan
  • tianzengyan
  • 2010年04月08日 11:04
  • 4154

解决linux环境下nohup: redirecting stderr to stdout问题

在生产环境下启动Weblogic时,发现原来好好的nohup信息输出到指定文件中的功能,突然出问题了。现象是控制台输出的信息一部分输出到了我指定的文件,另一部分却输出到了nohup.out,而我是不想...
  • educast
  • educast
  • 2014年06月03日 17:27
  • 30948

Linux - 标准输入(input)\输出(output)\错误(error) 详解

标准输入(input)\输出(output)\错误(error) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2393...
  • u012515223
  • u012515223
  • 2014年04月17日 15:17
  • 4708

nohup: redirecting stderr to stdout的解决办法

最近发现在用服务器上用nohup后台运行matlab命令时,输入回车后总是有“nohup: redirecting stderr to stdout”这样的提示,我的命令是这样的: nohup ma...
  • JustHaveTry
  • JustHaveTry
  • 2015年05月04日 16:21
  • 4031

Standard Input and Output Redirection

Standard Input and Output Redirection The shell and many UNIX commands take their input from stan...
  • silent325
  • silent325
  • 2014年11月14日 00:23
  • 540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redirecting Standard Input/Output using the Process Class
举报原因:
原因补充:

(最多只允许输入30个字)