[JAVA] Fork java

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Salve, ho intenzione di usare la fork() in java ma non so bene, dopo la fork, come capire in quale processo mi trovo?
Ho trovato una dispensa secondo la quale invoke è il figlio ed execute è padre
È corretto?
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
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?
 

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Grazie della risposta, una domanda, attraverso quale sintassi è possibile avviare un programma all'interno di un altro?
 

Andretti60

Utente Èlite
6,440
5,091
Dipende dal linguaggio, dal sistema operativo e dal livello di controllo che si vuole avere sul programma avviato. Devi essere più specifico, magari con un caso particolare.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili