Функция syscall.ForkExec
Функция syscall.ForkExec создает новый процесс,
выполняя системные вызовы fork и exec.
В первый параметр передается путь к исполняемому файлу,
во второй - аргументы командной строки в виде слайса строк,
в третий - атрибуты процесса.
Функция возвращает идентификатор нового процесса и ошибку,
если таковая возникла.
Синтаксис
pid, err := syscall.ForkExec(path, args, attr)
Пример 1
Давайте создадим новый процесс для выполнения команды
'echo' с аргументом 'hello world':
package main
import (
"fmt"
"syscall"
)
func main() {
path := "/bin/echo"
args := []string{"echo", "hello world"}
attr := &syscall.ProcAttr{
Dir: "",
Env: []string{},
Files: []uintptr{0, 1, 2},
}
pid, err := syscall.ForkExec(path, args, attr)
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("pid:", pid)
}
}
Результат выполнения кода:
hello world
pid: 12345
Пример 2
Давайте создадим новый процесс для выполнения команды
'ls' с аргументом '-la':
package main
import (
"fmt"
"syscall"
)
func main() {
path := "/bin/ls"
args := []string{"ls", "-la"}
attr := &syscall.ProcAttr{
Dir: "/tmp",
Env: []string{"USER=go"},
Files: []uintptr{0, 1, 2},
}
pid, err := syscall.ForkExec(path, args, attr)
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("pid:", pid)
}
}
Результат выполнения кода:
total 0
drwxrwxrwt 1 root root 4096 Sep 4 10:00 .
drwxr-xr-x 1 root root 4096 Sep 4 09:55 ..
pid: 12346
Пример 3
Давайте создадим новый процесс для выполнения команды
'sleep' с аргументом '2' и подождем его завершения:
package main
import (
"fmt"
"syscall"
"time"
)
func main() {
path := "/bin/sleep"
args := []string{"sleep", "2"}
attr := &syscall.ProcAttr{
Dir: "",
Env: []string{},
Files: []uintptr{0, 1, 2},
}
pid, err := syscall.ForkExec(path, args, attr)
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("pid:", pid)
process, _ := os.FindProcess(pid)
state, _ := process.Wait()
fmt.Println("process state:", state)
}
}
Результат выполнения кода:
pid: 12347
process state: exit status 0
Смотрите также
-
функцию
syscall.Exec,
которая заменяет текущий процесс новой программой -
функцию
syscall.Kill,
которая отправляет сигнал процессу -
функцию
os.StartProcess,
которая запускает новый процесс с указанными атрибутами -
функцию
exec.Command,
которая предоставляет более высокоуровневый API для запуска команд