我在MSDN中阅读了Creating a Child Process with Redirected Input and Output。
我已重定向输出。但在我的情况下,重定向输入与此示例不同。
我在子进程中运行java -jar xxx.jar
。将输入重定向到stdinPipe成功。但是我发现子进程jar没有读取输入。
我已重定向输入句柄,如下所示:
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.hStdInput = g_hChildStd_IN_Rd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
// Create the child process.
bSuccess = CreateProcess(NULL,
szCmdline, // command line which I use "java -jar xxx.jar"
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
当我使用bSuccess = WriteFile(g_hChildStd_IN_Wr, pCmd, strlen(pCmd), &dwWritten, NULL);
时。它在我的小测试jar文件上运行完美,该文件使用System.out.println()
和System.in.read()
来输出和输入。
但是当我运行jar服务器时,输入无效且重定向失败。我唯一知道的是jar使用ConsoleReader(System.in, System.out)
。我不熟悉java。所以任何人都可以知道禁止的内容我要重定向输入?
非常感谢!!
P.S。源代码与开头给出的链接相同。
最后我发现问题在于jline.console.ConsoleReader.readLine(">",null)
。我用arg -nojline
运行java,一切都很好!
我还没有读过jline.console.ConsoleReader的源代码。我很高兴有人能说出System.in.read()
和jline.console.ConsoleReader.readLine(">",null)
之间的区别。
问题代码如下:
if (!useConsole) {
return;
}
// CraftBukkit end
jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit
String s;
try {
// CraftBukkit start - JLine disabling compatibility
while (!this.server.isStopped() && this.server.isRunning()) {
if (useJline) {
s = bufferedreader.readLine(">", null);
} else {
s = bufferedreader.readLine();
}
if (s != null) {
this.server.issueCommand(s, this.server);
}
// CraftBukkit end
}
} catch (IOException ioexception) {
DedicatedServer.az().error("Exception handling console input", ioexception);
}
因此,使用jline.console.ConsoleReader.readline()
也与jline.console.ConsoleReader.readline(">",null)
不同。
我会继续研究。
readline()函数等于readline(null,null)。这意味着“>”根据第493行的源代码,不会显示提示但其他是相同的。所以我怀疑是我的Windows操作系统(win8.1)导致代码运行到if (!terminal.isSupported())
代码?或者我还没有理解源代码?不熟悉java是如此困难。