Анонимный канал Java WINAPI недействителен / не найден?

Кажется, что Java не может наследовать анонимные каналы от WinAPI, я использую свою собственную библиотеку и не могу понять, в чем проблема.

Источник библиотеки для текущего коммита.

Анонимный тест:

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_ATTRIBUTES с bInheritHandle, установленным в true.

Затем, после создания клиентской стороны, я закрываю дескрипторы «клиентской» стороны.

Что мне не хватает?

Обновлено: я пропустил ошибки. Метод test выбрасывает The specified procedure could not be found., по крайней мере, в соответствии с Windows, что для меня не имеет смысла.

Другой процесс выкидывает The handle is invalid., опять же согласно 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
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
172
1

Ответы 1

Я помню, как читал здесь, что дескрипторы из одного процесса недействительны в другом процессе и что анонимные каналы окон Java работали только между потоками. Это объяснило бы неправильный дескриптор.

Наследование ручки трубы не согласен с первоначальным утверждением.
IInspectable 07.08.2018 03:06

обрабатывает, конечно, значение процесса и имеет смысл только в контексте процесса. но наследование - это когда дескриптор дублируется дочернему процессу от родителя с тем же значением. что ты имеешь ввиду под работает только между потоками я вообще не понимаю.

RbMm 07.08.2018 08:53

Я хочу сказать, что если дочерний процесс имеет другой pid (который должен), то дескриптор анонимного канала недействителен, если вы не исправите его с помощью duplicatehandle (forum.codeguru.com/…)

Micromuncher 07.08.2018 22:18

Теперь это то, что я мог бы использовать, я изучу это.

gudenau 07.08.2018 22:26

DuplicateHandle сообщает, что дескриптор недействителен. Как странно.

gudenau 07.08.2018 22:52

Другие вопросы по теме