proporciona una forma de hackers que es similar a la respuesta de @tomkri y también proporcionan el código de demostración.
Si su proceso hijo no necesita el uso de la secuencia de entrada, simplemente redirija la secuencia de entrada del proceso secundario a la secuencia de entrada del proceso principal. A continuación, agregue un subproceso en el elemento secundario para leer siempre la secuencia de entrada y, cuando este subproceso no pueda leer nada de la secuencia de entrada, este proceso secundario finaliza. Entonces el proceso padre sale -> la corriente de entrada de los padres no existe -> la corriente de entrada del niño no existe -> el proceso hijo sale.
Aquí está el código de la demo, todo en Java.
proceso primario:
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.");
}
}
proceso hijo:
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);
}
}
Después de ejecutar este proceso los padres por el siguiente comando:
java process.parent_child.ParentProc
verá
I'm parent.
I'm child process.
Parent exits.
xmpy-mbp:bin zhaoxm$
Child exits
El proceso secundario sale inmediatamente cuando el proceso primario finaliza.
Comprobar el estado del padre periódicamente puede ser confiable si está encuestando para ver si el PPID del hijo se convierte en 1, ya que los procesos huérfanos obtienen un PPID del proceso init. (PID = 1) – Aaron
Si alguien se pregunta, en los sistemas Android pid parece ser 0 (procesar System pid) en lugar de 1, cuando el padre muere. –
Acabo de implementar esta "comprobación de estado parental" con una mejora simple: simplemente paso el original parent_pid a los niños y ellos simplemente comprueban si el pid padre permanece igual. Por lo tanto, debería funcionar independientemente del valor numérico pid/init/systemd/whatever. –