Тип syscall.Signal
Тип syscall.Signal представляет собой целочисленный тип,
используемый для идентификации сигналов операционной системы.
Он определен как псевдоним для int и используется в системных
вызовах для отправки и обработки сигналов. Основное применение
типа syscall.Signal - работа с функциями управления процессами,
такими как os.Process.Signal и syscall.Kill.
Синтаксис
type Signal int
Тип syscall.Signal реализует интерфейс fmt.Stringer,
что позволяет получить строковое представление сигнала.
Константы сигналов определены в пакете syscall и имеют
названия вида SIGINT, SIGTERM, SIGKILL и другие.
Пример
Давайте получим строковое представление сигнала SIGINT:
package main
import (
"fmt"
"syscall"
)
func main() {
sig := syscall.SIGINT
fmt.Println(sig)
}
Результат выполнения кода:
"interrupt"
Пример
Давайте сравним числовое значение и строковое представление
сигнала SIGTERM:
package main
import (
"fmt"
"syscall"
)
func main() {
sig := syscall.SIGTERM
fmt.Printf("Числовое значение: %d\n", sig)
fmt.Printf("Строковое представление: %s\n", sig)
}
Результат выполнения кода:
"Числовое значение: 15"
"Строковое представление: terminated"
Пример
Давайте проверим, является ли значение сигнала допустимым. Если сигнал неизвестен, его строковое представление будет содержать числовой код:
package main
import (
"fmt"
"syscall"
)
func main() {
validSig := syscall.SIGUSR1
invalidSig := syscall.Signal(999)
fmt.Println(validSig)
fmt.Println(invalidSig)
}
Результат выполнения кода:
"user defined signal 1"
"Signal 999"
Пример
Давайте используем тип syscall.Signal для отправки сигнала
процессу через os.Process.Signal:
package 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)
}
Результат выполнения кода:
"PID процесса: 12345"
"Сигнал SIGTERM отправлен успешно"
"Процесс завершен, ошибка: signal: terminated"
Смотрите также
-
тип
syscall.Errno,
который представляет коды ошибок системных вызовов -
функцию
syscall.Kill,
которая отправляет сигнал процессу -
функцию
os.Process.Signal,
которая отправляет сигнал процессу через пакет os -
функцию
signal.Notify,
которая позволяет перехватывать и обрабатывать сигналы