Le Go par l'exemple: Exécuter des processus

Dans l’exemple précédent, nous avions regardé comment lancer des processus externes. On fait ça quand on a besoin d’un processus externe accessible à un processus Go qui tourne. Parfois, on veut complètement remplacer le processus Go en cours avec un autre (peut-être non-Go). Pour cela, nous allos utiliser l’implémenter Go de la fonction classique exec.

package main
import "syscall"
import "os"
import "os/exec"
func main() {

Pour cet exemple, nous allons lancer ls. Go a besoin d’un chemin absolu vers l’exécutable que l’on veut lancer, donc on va utiliser exec.LookPath pour le localiser (il est probablement situé dans /bin/ls).

    binary, lookErr := exec.LookPath("ls")
    if lookErr != nil {
        panic(lookErr)
    }

Exec a besoin d’une slice pour les arguments (et non une grosse chaîne). On va donner à ls quelques arguments courants. A noter que le premier arguments doit être le nom du programme.

    args := []string{"ls", "-a", "-l", "-h"}

Exec a également besoin d’un ensemble de variables d’environnement. Ici, on va lui fournir notre environnement actuel.

    env := os.Environ()

Voici enfin l’appel à syscall.Exec. Si l’appel réussit, l’exécution de notre processus va s’arrêter et sera remplacé par celui de /bin/ls -a -l -h S’il y a une erreur, nous aurons une valeur de retour.

    execErr := syscall.Exec(binary, args, env)
    if execErr != nil {
        panic(execErr)
    }
}

Quand on lance notre programme, il est remplacé par ls.

$ go run execing-processes.go
total 16
drwxr-xr-x  4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go

Notez que Go ne propose pas la fonction Unix classique fork. En général, ce n’est pas un problème, car lancer des goroutines, des processus et exécuter des processus couvre la plupart des cas d’usage de fork.

Exemple suivant: Signaux.