Укажите способ хакера, аналогичный ответу от @tomkri, а также укажите демонстрационный код.
Если вашему дочернему процессу не требуется использовать входной поток, просто перенаправьте входной поток дочернего процесса во входной поток его родительского процесса. Затем добавьте поток в дочерний процесс, чтобы всегда читать входной поток, и когда этот поток не может ничего прочитать из входного потока, этот дочерний процесс завершается. Таким образом, родительский процесс завершается -> родительский входной поток не существует -> дочерний входной поток не существует -> дочерний процесс завершается.
Вот демонстрационный код на Java.
Родительский процесс:
package process.parent_child;
import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
public class ParentProc {
public static void main(String[] args) {
System.out.println("I'm parent.");
String javaHome = System.getProperty("java.home");
String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
ProcessBuilder builder = new ProcessBuilder(javaBin, "process.parent_child.ChildProc");
// Redirect subprocess's input stream to this parent process's input stream.
builder.redirectInput(Redirect.INHERIT);
// This is just for see the output of child process much more easily.
builder.redirectOutput(Redirect.INHERIT);
try {
Process process = builder.start();
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Parent exits.");
}
}
Дочерний процесс:
package process.parent_child;
import java.io.IOException;
import java.util.Scanner;
public class ChildProc {
private static class StdinListenerThread extends Thread {
public void run() {
int c;
try {
c = System.in.read();
while ( c != -1 ) {
System.out.print(c);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("\nChild exits.");
System.exit(0);
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("I'm child process.");
StdinListenerThread thread = new StdinListenerThread();
thread.start();
Thread.sleep(10000);
}
}
После запуска этого родительского процесса с помощью следующей команды:
java process.parent_child.ParentProc
Вы увидите
I'm parent.
I'm child process.
Parent exits.
xmpy-mbp:bin zhaoxm$
Child exits
Дочерний процесс завершается сразу после выхода из родительского процесса.