Exécuter DES Processus

Exécuter des processus #

// Dans l'exemple précédent, nous avions regardé comment [lancer des processus externes](spawning-processes). 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](https://en.wikipedia.org/wiki/Exec_(system_call)).

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](environment-variables). 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`.