Функция syscall.Exec
Функция syscall.Exec заменяет текущий процесс
на новый, выполняя указанную программу с заданными
аргументами и переменными окружения. В первый параметр
функция принимает путь к исполняемому файлу, во второй -
аргументы командной строки (включая имя программы),
в третий - переменные окружения в виде слайса строк
формата key=value.
Важно понимать, что syscall.Exec не создает
новый процесс, а полностью замещает текущий. После
успешного вызова этой функции управление никогда
не возвращается обратно в исходную программу.
В случае ошибки функция возвращает ошибку,
которую можно обработать.
Синтаксис
syscall.Exec(argv0, argv, envv)
Пример
Давайте заменим текущий процесс на выполнение команды
ls с аргументом -la:
package main
import (
"fmt"
"syscall"
)
func main() {
path := "/bin/ls"
args := []string{"ls", "-la"}
env := syscall.Environ()
err := syscall.Exec(path, args, env)
if err != nil {
fmt.Println("Error:", err)
}
}
Результат выполнения кода:
"total 1234
drwxr-xr-x 2 user user 4096 Sep 4 10:00 .
drwxr-xr-x 3 user user 4096 Sep 4 09:00 ..
-rw-r--r-- 1 user user 1234 Sep 4 10:00 file1.txt"
Пример
Давайте заменим текущий процесс на выполнение команды
echo с пользовательскими переменными окружения:
package main
import (
"fmt"
"syscall"
)
func main() {
path := "/bin/echo"
args := []string{"echo", "Hello from syscall.Exec"}
env := []string{"USER=go-user", "HOME=/home/go-user"}
err := syscall.Exec(path, args, env)
if err != nil {
fmt.Println("Error:", err)
}
}
Результат выполнения кода:
"Hello from syscall.Exec"
Пример
Давайте рассмотрим обработку ошибки при попытке выполнить несуществующую программу:
package main
import (
"fmt"
"syscall"
)
func main() {
path := "/bin/nonexistent"
args := []string{"nonexistent"}
env := syscall.Environ()
err := syscall.Exec(path, args, env)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println("This line will be executed only on error")
}
Результат выполнения кода:
"Error: no such file or directory"
"This line will be executed only on error"
Обратите внимание, что в случае ошибки программа
продолжает выполнение, поэтому код после вызова
syscall.Exec выполняется только при
возникновении ошибки.
Смотрите также
-
функцию
syscall.ForkExec,
которая создает новый процесс, а не заменяет текущий -
функцию
syscall.Kill,
которая отправляет сигнал процессу -
функцию
exec.Command,
которая создает структуру для выполнения внешней команды -
функцию
os.StartProcess,
которая запускает новый процесс с заданными параметрами