Функция syscall.ForkExec

Функция syscall.ForkExec создает новый процесс, выполняя системные вызовы fork и exec. В первый параметр передается путь к исполняемому файлу, во второй - аргументы командной строки в виде слайса строк, в третий - атрибуты процесса. Функция возвращает идентификатор нового процесса и ошибку, если таковая возникла.

Синтаксис

gopid, err := syscall.ForkExec(path, args, attr)

Пример 1

Давайте создадим новый процесс для выполнения команды 'echo' с аргументом 'hello world':

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

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

gohello world
pid: 12345

Пример 2

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

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

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

gototal 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' и подождем его завершения:

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

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

gopid: 12347
process state: exit status 0

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

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