Мне недавно нужно было сделать это для дочернего процесса Java, работающего в тюрьме. Это означало, что у него не было доступа к файловой системе / dev / fd.
@ Божо прокомментировал, что отражение может или не может работать для создания объекта FileDescriptor. Похоже, что он работает в простом тесте, который я сделал. Ниже приведен источник для TestFD.java:
import java.lang.reflect.Constructor;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
public class TestFD {
public static void main(String[] args) throws Exception {
Constructor<FileDescriptor> ctor = FileDescriptor.class.getDeclaredConstructor(Integer.TYPE);
ctor.setAccessible(true);
FileDescriptor fd = ctor.newInstance(3);
ctor.setAccessible(false);
new FileOutputStream(fd).write("hi there\n".getBytes());
}
}
Чтобы проверить это, я создал простой Bash-скрипт, который компилирует его, устанавливает fd3 и запускает java-программу:
#!/bin/bash
javac TestFD.java
exec 3>&1 # open fd3, redirect to stdout
java TestFD
exec 3>&-
Конечно, fd3 перенаправляется на стандартный вывод и выводит "hi there \ n" на терминал. Закомментируйте строку "exec 3> & 1", и Java-программа завершится неудачно, как и ожидалось, с IOException "Устройство не настроено".
Отражение в частном конструкторе FileDescriptor, кажется, работает нормально в тех случаях, когда доступ к / dev / fd невозможен, и менее сложен, чем попытка создать FileDescriptor с использованием JNI, что я видел в другом месте.
Примечание. Я проверил это в системе BSD. Может работать или не работать в других системах.