Функция syscall.Exec

Функция syscall.Exec заменяет текущий процесс на новый, выполняя указанную программу с заданными аргументами и переменными окружения. В первый параметр функция принимает путь к исполняемому файлу, во второй - аргументы командной строки (включая имя программы), в третий - переменные окружения в виде слайса строк формата key=value.

Важно понимать, что syscall.Exec не создает новый процесс, а полностью замещает текущий. После успешного вызова этой функции управление никогда не возвращается обратно в исходную программу. В случае ошибки функция возвращает ошибку, которую можно обработать.

Синтаксис

gosyscall.Exec(argv0, argv, envv)

Пример

Давайте заменим текущий процесс на выполнение команды ls с аргументом -la:

gopackage 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)
  }
}

Результат выполнения кода:

go"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 с пользовательскими переменными окружения:

gopackage 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)
  }
}

Результат выполнения кода:

go"Hello from syscall.Exec"

Пример

Давайте рассмотрим обработку ошибки при попытке выполнить несуществующую программу:

gopackage 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")
}

Результат выполнения кода:

go"Error: no such file or directory"
"This line will be executed only on error"

Обратите внимание, что в случае ошибки программа продолжает выполнение, поэтому код после вызова syscall.Exec выполняется только при возникновении ошибки.

Смотрите также

  • функцию syscall.ForkExec,
    которая создает новый процесс, а не заменяет текущий
  • функцию syscall.Kill,
    которая отправляет сигнал процессу
  • функцию exec.Command,
    которая создает структуру для выполнения внешней команды
  • функцию os.StartProcess,
    которая запускает новый процесс с заданными параметрами