Esiste la fork in Java? E' la prima volta che lo sento.
In Java si usano:
1. Runtime.exec
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.html
2. ProcessBuilder che offre delle cose in piu'
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ProcessBuilder.html
3. infine c'e' il framework Fork/Join ( da non confondere con la fork di Unix )
https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
L'ultimo e' decisamente ipercomplicato per usi normali. Imho utilizza Runtime.exec e risparmi tempo e mal di testa.
Il problema che ponevi e' relativo alla semantica della fork di Unix, che pero' non e' la stessa in Java. Cioe' Unix forka un processo, ovvero prende il padre, ne fa una copia e la manda in esecuzione. A questo punto, quale dei due cloni sa di essere il padre? Cioe' sono cloni, dal loro punto di vista ognuno e' il padre.
Ed e' qui che la fork fa la sua magia. Ovvero restituisce il valore di ritorno 0 al figlio, un valore maggiore di 0 ( che poi e' il PID del figlio ) al padre. In caso di errore, restituisce solo un valore minore di 0 al padre.
Cioe' immagina il clone e il padre che, dopo la fork, continuano come prima ( e hanno le stesse istruzioni al loro interno ). Il programmatore mette un if
C:
pid = fork();
if (pid == 0) {
// sono il figlio
} else {
// sono il padre
// controllo anche che se PID < 0 allora il figlio non e' stato creato
// e c'e' stato un errore
}
Ma in Java non accade niente di tutto questo. Quelle funzioni creano un nuovo processo ( figlio, ma pure il termine non e' che sia corretto al 100% ) e lo usano per eseguire un altro programma, specificato dal programmatore. Ma in nessun caso il figlio e' un clone del padre. E quindi viene proprio meno la necessita' di fare quel controllo di cui sopra.
p.s. la dispensa cosa intende per invoke ed execute?