Тип syscall.Signal

Тип syscall.Signal представляет собой целочисленный тип, используемый для идентификации сигналов операционной системы. Он определен как псевдоним для int и используется в системных вызовах для отправки и обработки сигналов. Основное применение типа syscall.Signal - работа с функциями управления процессами, такими как os.Process.Signal и syscall.Kill.

Синтаксис

gotype Signal int

Тип syscall.Signal реализует интерфейс fmt.Stringer, что позволяет получить строковое представление сигнала. Константы сигналов определены в пакете syscall и имеют названия вида SIGINT, SIGTERM, SIGKILL и другие.

Пример

Давайте получим строковое представление сигнала SIGINT:

gopackage main

import (
  "fmt"
  "syscall"
)

func main() {
  sig := syscall.SIGINT
  fmt.Println(sig)
}

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

go"interrupt"

Пример

Давайте сравним числовое значение и строковое представление сигнала SIGTERM:

gopackage main

import (
  "fmt"
  "syscall"
)

func main() {
  sig := syscall.SIGTERM
  fmt.Printf("Числовое значение: %d\n", sig)
  fmt.Printf("Строковое представление: %s\n", sig)
}

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

go"Числовое значение: 15"
"Строковое представление: terminated"

Пример

Давайте проверим, является ли значение сигнала допустимым. Если сигнал неизвестен, его строковое представление будет содержать числовой код:

gopackage main

import (
  "fmt"
  "syscall"
)

func main() {
  validSig := syscall.SIGUSR1
  invalidSig := syscall.Signal(999)

  fmt.Println(validSig)
  fmt.Println(invalidSig)
}

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

go"user defined signal 1"
"Signal 999"

Пример

Давайте используем тип syscall.Signal для отправки сигнала процессу через os.Process.Signal:

gopackage main

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

func main() {
  // Запускаем дочерний процесс
  cmd := exec.Command("sleep", "10")
  cmd.Start()

  fmt.Printf("PID процесса: %d\n", cmd.Process.Pid)

  // Отправляем сигнал SIGTERM через 2 секунды
  time.Sleep(2 * time.Second)
  err := cmd.Process.Signal(syscall.SIGTERM)
  if err != nil {
    fmt.Printf("Ошибка отправки сигнала: %s\n", err)
  } else {
    fmt.Println("Сигнал SIGTERM отправлен успешно")
  }

  // Ждем завершения процесса
  err = cmd.Wait()
  fmt.Printf("Процесс завершен, ошибка: %v\n", err)
}

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

go"PID процесса: 12345"
"Сигнал SIGTERM отправлен успешно"
"Процесс завершен, ошибка: signal: terminated"

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

  • тип syscall.Errno,
    который представляет коды ошибок системных вызовов
  • функцию syscall.Kill,
    которая отправляет сигнал процессу
  • функцию os.Process.Signal,
    которая отправляет сигнал процессу через пакет os
  • функцию signal.Notify,
    которая позволяет перехватывать и обрабатывать сигналы