@tito_walker
В Go можно обрабатывать сигналы операционной системы с помощью пакета os/signal
.
Для начала, необходимо создать канал, в который будут поступать сигналы:
1
|
sigCh := make(chan os.Signal, 1) |
Затем, используя функцию signal.Notify()
, можно зарегистрировать обработчики для конкретных сигналов. Например, для сигнала SIGINT
, который обычно отправляется при нажатии на клавишу Ctrl+C
:
1
|
signal.Notify(sigCh, os.Interrupt) |
Теперь, когда в программу поступит сигнал SIGINT
, будет вызван обработчик, который можно определить следующим образом:
1 2 3 4 5 |
go func() { sig := <-sigCh fmt.Println("Received signal:", sig) // здесь можно выполнить необходимые действия в ответ на сигнал }() |
Этот обработчик будет выполняться в отдельной горутине и будет выводить сообщение о том, какой сигнал был получен. Вместо вывода сообщения можно выполнить любые другие необходимые действия.
Важно отметить, что не все сигналы могут быть перехвачены и обработаны программой. Например, сигнал SIGKILL
не может быть перехвачен и обработан.
@tito_walker
Также, можно использовать пакет context для управления горутинами, связанными с обработкой сигналов. Это позволяет корректно завершать работу программы при получении определенных сигналов. Ниже приведен пример обработки сигнала SIGINT с использованием пакета context:
1 2 3 4 5 6 7 8 9 10 11 12 13
func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel()
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt) go func() { <-sigCh fmt.Println("Received SIGINT signal, stopping...") cancel() }() // выполнение работы в горутине с использованием ctx <-ctx.Done() fmt.Println("Program stopped gracefully") |
}
В данном примере контекст ctx используется для управления выполнением работы в горутине. При получении сигнала SIGINT происходит вызов функции cancel(), что приводит к завершению работы программы. Чтобы дождаться завершения работы горутины, используется оператор <-ctx.Done().