Функция os.FindProcess

Функция os.FindProcess находит процесс по его идентификатору (PID). Она принимает один параметр — целое число pid (идентификатор процесса). Функция возвращает указатель на структуру os.Process и ошибку типа error. Если процесс с таким PID не найден, возвращается ошибка. Важно отметить, что на разных операционных системах поведение функции может отличаться. Например, в Unix-подобных системах она всегда возвращает объект процесса, даже если процесс уже завершился, а ошибка возвращается только при системном сбое. Проверить существование процесса можно с помощью метода Signal или Wait.

Синтаксис

goos.FindProcess(pid)

Пример

Давайте найдем процесс по его PID и выведем информацию о нем:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  pid := 1 // Обычно это PID системного процесса
  proc, err := os.FindProcess(pid)
  if err != nil {
    fmt.Printf("Ошибка: %v\n", err)
    return
  }
  fmt.Printf("Процесс с PID %d найден\n", pid)
  fmt.Printf("Объект процесса: %+v\n", proc)
}

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

go"Процесс с PID 1 найден"
"Объект процесса: &{Pid:1 handle:0 ...}"

Пример

Попробуем найти процесс с несуществующим PID и обработать ошибку:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  pid := 999999 // Заведомо несуществующий PID
  proc, err := os.FindProcess(pid)
  if err != nil {
    fmt.Printf("Процесс не найден: %v\n", err)
    return
  }
  fmt.Printf("Процесс найден: %+v\n", proc)
}

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

go"Процесс не найден: os: process with pid 999999 does not exist"

Пример

Проверим, существует ли процесс, с помощью метода Signal. Для этого отправим сигнал os.Signal равный 0, который не отправляет реальный сигнал, но проверяет существование процесса:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  pid := 1
  proc, err := os.FindProcess(pid)
  if err != nil {
    fmt.Printf("Ошибка: %v\n", err)
    return
  }

  // Проверяем существование процесса с помощью сигнала 0
  err = proc.Signal(os.Signal(nil)) // nil не подходит, используем syscall.Signal
  if err != nil {
    fmt.Printf("Процесс не существует или недоступен: %v\n", err)
    return
  }
  fmt.Println("Процесс существует и доступен для управления")
}

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

go"Процесс существует и доступен для управления"

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

  • функцию os.Process.Kill,
    которая завершает процесс
  • функцию os.Process.Signal,
    которая отправляет сигнал процессу
  • функцию os.Process.Wait,
    которая ожидает завершения процесса
  • функцию os.Process.Release,
    которая освобождает ресурсы, связанные с процессом