РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1453 of 1593 menu

Функция 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,
    которая запускает новый процесс с заданными параметрами
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить