Java WINAPI匿名管道无效/未找到?
Java似乎无法从WinAPI继承匿名管道,我正在使用自己的库,无法找出问题所在 anon测试:Java WINAPI匿名管道无效/未找到?,java,windows,winapi,pipe,anonymous-pipes,Java,Windows,Winapi,Pipe,Anonymous Pipes,Java似乎无法从WinAPI继承匿名管道,我正在使用自己的库,无法找出问题所在 anon测试: package net.gudenau.lib.pipes.test; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import net.gude
package net.gudenau.lib.pipes.test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import net.gudenau.lib.pipes.AnonymousPipeHandle;
import net.gudenau.lib.pipes.PipeHandle;
import net.gudenau.lib.pipes.Pipes;
public class AnonymousPipe{
public static void main(String[] args){
try(PipeHandle client = Pipes.findPipe()){
InputStream inputStream = client.getInputStream();
OutputStream outputStream = client.getOutputStream();
byte[] data = "This is from the anon pipe!".getBytes(StandardCharsets.UTF_16);
outputStream.write(data.length);
outputStream.write(data);
data = new byte[inputStream.read()];
inputStream.read(data);
System.out.printf("Server says: %s\n", new String(data, StandardCharsets.UTF_16));
}catch(IOException e){
e.printStackTrace();
System.exit(0);
}
}
static void test(){
File path = new File(System.getProperty("java.home") + File.separator + "bin");
File executable;
if(System.getProperty("os.name").toLowerCase().contains("windows")){
executable = new File(path, "javaw.exe");
}else{
executable = new File(path, "java");
}
ProcessBuilder processBuilder = new ProcessBuilder(
executable.getAbsolutePath(),
"-Dfile.encoding=UTF-8",
"-classpath",
System.getProperty("java.class.path"),
"net.gudenau.lib.pipes.test.AnonymousPipe"
);
processBuilder.inheritIO();
try(AnonymousPipeHandle pipe = Pipes.createPipe()){
pipe.setupHandleShare(processBuilder);
Process process = processBuilder.start();
pipe.clientConnected();
InputStream inputStream = pipe.getInputStream();
OutputStream outputStream = pipe.getOutputStream();
byte[] data = new byte[inputStream.read()];
inputStream.read(data);
String message = new String(data, StandardCharsets.UTF_16);
System.out.printf("Client says: %s\n", new String(data, StandardCharsets.UTF_16));
data = message.toUpperCase().getBytes(StandardCharsets.UTF_16);
outputStream.write(data.length);
outputStream.write(data);
try{
process.waitFor();
}catch(InterruptedException ignored){}
}catch(IOException e){
e.printStackTrace();
System.exit(-1);
}
}
}
就我所知,所有这些我都做对了
我正在使用CreatePipe
使用SECURITY\u属性创建anon管道,并将bInheritHandle
设置为true
然后在创建客户端之后,我关闭“客户端”句柄
我错过了什么
编辑:我把错误隔开了,漏掉了。
test
方法抛出的指定过程找不到。
,至少在Windows中是这样,这对我来说毫无意义
另一个进程抛出句柄无效。
,同样根据Windows
输出:
Client says: the quick brown fox jumps over the lazy dog
Server says: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
java.io.IOException: The specified procedure could not be found.
at net.gudenau.lib.pipes.impl.windows.WindowsPipeInputStream.read(WindowsPipeInputStream.java:34)
at java.base/java.io.InputStream.read(InputStream.java:106)
at net.gudenau.lib.pipes.impl.windows.WindowsPipeInputStream.read(WindowsPipeInputStream.java:16)
at net.gudenau.lib.pipes.test.AnonymousPipe.test(AnonymousPipe.java:57)
at net.gudenau.lib.pipes.test.PipeTest.main(PipeTest.java:6)
java.io.IOException: The handle is invalid.
at net.gudenau.lib.pipes.impl.windows.WindowsPipeOutputStream.write(WindowsPipeOutputStream.java:35)
at java.base/java.io.OutputStream.write(OutputStream.java:77)
at net.gudenau.lib.pipes.impl.windows.WindowsPipeOutputStream.write(WindowsPipeOutputStream.java:15)
at net.gudenau.lib.pipes.test.AnonymousPipe.main(AnonymousPipe.java:19)
Process finished with exit code -1
我记得读过一篇文章说,一个进程的句柄在另一个进程中无效,Java windows匿名管道只在线程之间工作。这将解释一个无效句柄。与初始语句不一致。句柄当然是每个进程值的,并且只有在进程上下文中才有意义。但继承-这是当句柄从具有相同值的父进程复制到子进程时。我的观点是,如果子进程有一个不同的pid(它应该有),那么匿名管道的句柄是无效的,除非你用duplicatehandle()修复它,现在我可以使用它了,我会调查的。DuplicateHandle说这个句柄无效。真奇怪。