Exec di Processi

I comandi eseguiti da un programma Go ereditano l'ambiente del processo Go in esecuzione.

La funzione LookPath() ricerca nel PATH un comando non qualificato.
Se lo trova lo registra in un oggetto, altrimenti torna un errore.
E' l'equivalente del comando Unix which.

(630execing-processes.go):

package main

import "syscall"
import "os"
import "os/exec"

func main() {
	// Registrazione del comando con ricerca 
	// nel $PATH se necessario
	binary, lookErr := exec.LookPath("ls")
	if lookErr != nil {
		panic(lookErr)
	}

	// Vettore di esecuzione
	args := []string{"ls", "-a", "-l", "-h"}
	// Ambiente
	env := os.Environ()

	// System call che esegue il comando
	execErr := syscall.Exec(binary, args, env)
	if execErr != nil {
		panic(execErr)
	}
}

Si può eseguire un comando anche con una System call a basso livello tramite il package syscall, con la funzione Exec().
Invoca la system call execve() del linguaggio C, e il suo comportamento è uguale.

Questa ha bisogno di tre argomenti:

  • il comando
  • la lista degli argomenti
  • l'ambiente

Il comando è un oggetto.

La lista degli argomenti è una slice di stringhe, i token del vettore di lancio, ed include il comando stesso.

L'ambiente è una slice di stringhe, come visto in precedenza.