2011-05-10 56 views
0

我有一些启动java进程的c#代码。在运行Windows 7的一台机器上,它工作正常。在另一个正在运行的XP上它不会。下面是代码...启动过程中重定向标准错误和标准输入的问题

mServerProcess = new Process(); 
mServerProcess.StartInfo.FileName = "java"; 
mServerProcess.StartInfo.Arguments = "-jar my.jar"; 
mServerProcess.StartInfo.WorkingDirectory = "C:\\my_server"; 
mServerProcess.StartInfo.UseShellExecute = false; 
mServerProcess.StartInfo.CreateNoWindow = true; 
mServerProcess.StartInfo.RedirectStandardOutput = true; 
mServerProcess.StartInfo.RedirectStandardError = true; 
mServerProcess.StartInfo.RedirectStandardInput = true; 
mServerProcess.OutputDataReceived += new DataReceivedEventHandler(ServerOutputHandler); 
mServerProcess.ErrorDataReceived += new DataReceivedEventHandler(ServerErrorHandler); 
mServerProcess.SynchronizingObject = this.console; 

// Start the process. 
mServerProcess.Start(); 

// Start the asynchronous read of the sort output stream. 
mServerProcess.BeginOutputReadLine(); 
mServerProcess.BeginErrorReadLine(); 

在XP的机器我从来没有从进程的标准错误来的文字,和一般的进程似乎打破。我无法从标准输入流中发送任何内容。

现在......有趣的是,如果我将重定向标准输入的代码注释掉,我会得到标准错误。但是,当然,我也需要重定向标准输入。

有没有人见过这个?...重定向标准输入和标准错误导致问题?

再次...我没有这个问题在我的Windows 7框。

感谢, 巴兹

UPDATE:

我使用了Java Logger类输出信息从我的Java应用程序。我认为这个问题与Java特别有关,它的ConsoleHandler类如何处理标准错误。这让我疯狂!

回答

1

该进程可能正在等待一些输入。

试着给它一些输入。

+0

+1 - 烨 - *“如果我注释掉重定向标准输入的代码......” *是一条走不通的赠品:-) – 2011-05-10 01:33:36

+0

试过了。依然没有。 – BuzzB 2011-05-12 04:06:52

0

如果重定向输入和输出,则可能会使I/O发生死锁。根据缓冲区的不同,这可能在不同的操作系统或不同的输入和输出上有所不同。例如,它可能看起来工作正常时,与1k的输入,但与4k挂起。查看文档并搜索僵局:

+0

我已经遍布那个页面。我看不出我的方法有什么问题。我没有使用流上的任何阻塞读取调用。我正在使用异步调用。 – BuzzB 2011-05-12 04:09:08

0

你调用使用的JLine Java进程?如果是这样,那么你需要用下面的参数来调用它:

-Djline.terminal=jline.UnsupportedTerminal 
相关问题