Execing Processes

Заміна поточного процесу новим|Exec’ing Processes #

// Тепер, коли ми розглянули
// [запуск сторонніх процесів](spawning-processes), ми знаємо, що ми це робимо
// коли необхідно, щоб запущений процес був доступний нашому Go процесу.
// Інколи, все чого ми бажаємо - це лише повністю замінити поточний Go-процес
// іншим (можливо, навіть - не "Go-процесом"), для цього ми скорастаємось реалізацією
// одного з системних викликів - [exec](http://en.wikipedia.org/wiki/Exec_(operating_system)).

package main

import (
	"os"
	"os/exec"
	"syscall"
)

func main() {

	// Спробуємо виконати `ls` у нашому прикладі. Go необхідно абсолютний
	// шлях до програми, яку ми хочемо виконати - отож ми скористаємось
	// `exec.LookPath` щоб знайти її (і можливо ми знайдемо її як `/bin/ls`).
	binary, lookErr := exec.LookPath("ls")
	if lookErr != nil {
		panic(lookErr)
	}

	// Параметри передаються в `Exec` у вигляді [`зрізу`](slices)
	// (напротивагу одному рядку). Ми забезпечимо `ls`
	// кількома звичайними (для цієї команди) аргументами.
	args := []string{"-h", "-o"}

	// `Exec` також потребує [змінні оточення](environment-variables)
	// і ми ж надамо йому наше поточне середовище.
	env := os.Environ()

	// А ось - і власне виклик `syscall.Exec`. Якщо виклик успішний,
	// виконання нашого процесу завершиться і буде замінено процесом `/bin/ls -h -o`,
	// а якщо виникне помилка - то ми отримаємо [паніку](panic) з текстом помилки.
	execErr := syscall.Exec(binary, args, env)
	if execErr != nil {
		panic(execErr)
	}
}
# Виконання нашої програми замінено виконанням `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

# Note that Go does not offer a classic Unix `fork`
# function. Usually this isn't an issue though, since
# starting goroutines, spawning processes, and exec'ing
# processes covers most use cases for `fork`.