NUCLI 4 · Sessió 2 · ProcessHandle, start() i waitFor()
El llançador
Sistema a restaurar: Monitor de processos i codis de retorn
- Alerta
- Manual
- Reptes
- Mòdul
Aquest nucli ja està en marxa. Pots tornar-lo a jugar per repassar, però la puntuació desada no canviarà.
Manual del nucli
0 / 2Desbloqueja les 2 pàgines del manual per obrir els reptes. Llegeix-les bé: els reptes en pregunten els detalls.
Mirar el sistema amb ProcessHandle
ProcessHandle dona informació i control dels processos del sistema, també dels que no hem llançat nosaltres. Moltes dades tornen dins d'un Optional, perquè el sistema no sempre les deixa veure.
ProcessHandle jo = ProcessHandle.current();
System.out.println("PID: " + jo.pid());
System.out.println("Ordre: " + jo.info().command().orElse("?"));
System.out.println("Pare: " + jo.parent().map(p -> p.pid()).orElse(-1L));
long total = ProcessHandle.allProcesses().count();| Fragment | Què fa |
|---|---|
ProcessHandle.current() | El nostre propi procés. |
jo.info().command() | La ruta de l'executable. És un Optional<String>: orElse("?") posa un valor si no se sap. |
jo.parent() | El procés pare, també dins d'un Optional (pot no existir o no ser visible). |
ProcessHandle.allProcesses() | Un Stream amb tots els processos visibles: es pot filtrar, ordenar i comptar. |
Tres finals possibles d'un llançament
A l'exemple 2 vam llançar tres ordres amb el mateix mètode executa:
java -version: arrenca, va bé i retorna 0.java -opcio-inventada: arrenca, però falla i retorna un codi diferent de 0 (va donar 1).programa-que-no-existeix: ni tan sols arrenca. No hi ha codi de retorn:start()llança unaIOException.
Són dos errors diferents: un codi ≠ 0 vol dir «el fill ha funcionat i ha dit que ha fallat»; una IOException vol dir «no hi ha hagut fill».
static int executa(String... ordre) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(ordre);
pb.inheritIO();
Process p = pb.start();
int codi = p.waitFor();
if (codi != 0) {
System.out.println("[avís] el procés ha acabat amb error (" + codi + ")");
}
return codi;
}| Fragment | Què fa |
|---|---|
String... ordre | Paràmetre variable: es pot cridar amb tants textos com calgui (executable i arguments). |
pb.inheritIO() | El fill fa servir la mateixa consola que el pare: el que escriu surt directament a pantalla, i no cal llegir-ne els fluxos. |
p.waitFor() | Bloqueja fins que el fill acaba i en retorna el codi. |
if (codi != 0) | Qualsevol codi diferent de 0 és un error del fill. |
Nucli restaurat · Monitor de processos i codis de retorn
Monitor en línia: torna a veure el sistema i a llegir els codis de retorn.
- XP
- 0
- Bonus ratxa
- 0
- Errors
- 0
- Pistes
- 0
- Estrelles
- ☆☆☆
Anota la lletra i la seva posició: al kernel hauràs de compondre l'ordre de reinici.