Einführung
In diesem Lab geht es darum, den aktuellen Go-Prozess durch einen anderen Prozess zu ersetzen, indem die klassische exec
-Funktion in Go implementiert wird.
This tutorial is from open-source community. Access the source code
💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken
In diesem Lab geht es darum, den aktuellen Go-Prozess durch einen anderen Prozess zu ersetzen, indem die klassische exec
-Funktion in Go implementiert wird.
Das Problem besteht darin, den aktuellen Go-Prozess durch einen anderen Prozess, wie beispielsweise einen Nicht-Go-Prozess, zu ersetzen.
exec
-Funktion## Wenn wir unser Programm ausführen, wird es durch `ls` ersetzt.
$ go run execing-processes.go
gesamt 16
drwxr-xr-x 4 mark 136B Okt 3 16:29.
drwxr-xr-x 91 mark 3,0K Okt 3 12:50..
-rw-r--r-- 1 mark 1,3K Okt 3 16:28 execing-processes.go
## Beachten Sie, dass Go keine klassische Unix-`fork`-Funktion bietet.
## Normalerweise ist dies jedoch kein Problem, da das Starten von Goroutinen,
## das Erzeugen von Prozessen und das Ausführen von Prozessen die meisten
## Anwendungsfälle für `fork` abdecken.
Das vollständige Codebeispiel finden Sie hier unten:
// Im vorherigen Beispiel haben wir uns die [Erzeugung externer Prozesse](spawning-processes) angeschaut.
// Wir tun dies, wenn wir einen externen Prozess benötigen, auf den ein laufender Go-Prozess zugreifen kann.
// Manchmal möchten wir einfach den aktuellen Go-Prozess vollständig durch einen anderen (eventuell Nicht-Go-) ersetzen.
// Dazu verwenden wir die Go-Implementierung der klassischen <a href="https://en.wikipedia.org/wiki/Exec_(operating_system)"><code>exec</code></a>-Funktion.
package main
import (
"os"
"os/exec"
"syscall"
)
func main() {
// Für unser Beispiel werden wir `ls` ausführen. Go erfordert einen absoluten Pfad zur Binärdatei, die wir ausführen möchten,
// also verwenden wir `exec.LookPath`, um ihn zu finden (wahrscheinlich `/bin/ls`).
binary, lookErr := exec.LookPath("ls")
if lookErr!= nil {
panic(lookErr)
}
// `Exec` erfordert Argumente in Form eines Slices (im Gegensatz zu einem großen String).
// Wir werden `ls` einige übliche Argumente geben. Beachten Sie, dass das erste Argument der Programmname sein sollte.
args := []string{"ls", "-a", "-l", "-h"}
// `Exec` benötigt auch eine Reihe von [Umgebungsvariablen](environment-variables), die verwendet werden sollen.
// Hier geben wir einfach unsere aktuelle Umgebung an.
env := os.Environ()
// Hier erfolgt der tatsächliche `syscall.Exec`-Aufruf. Wenn dieser Aufruf erfolgreich ist, endet die Ausführung unseres Prozesses hier und wird durch den `/bin/ls -a -l -h`-Prozess ersetzt.
// Wenn ein Fehler auftritt, erhalten wir einen Rückgabewert.
execErr := syscall.Exec(binary, args, env)
if execErr!= nil {
panic(execErr)
}
}
In diesem Lab haben wir gelernt, wie man den aktuellen Go-Prozess durch einen anderen Prozess ersetzen kann, indem man die Go-Implementierung der klassischen exec
-Funktion verwendet. Dies kann nützlich sein, wenn wir einen Nicht-Go-Prozess aus einem Go-Programm heraus ausführen müssen.