To handle process signals and interrupts gracefully using syscalls in Go (Golang), you can utilize the os/signal
package along with goroutines. Here's an example:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// Create a signal channel to receive OS signals
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
// Create a goroutine to listen for signals
go func() {
sig := <-sigChan
fmt.Printf("Received signal: %s\n", sig)
// Perform any cleanup or graceful shutdown here
// Exit the program gracefully
os.Exit(0)
}()
// Run your main program code here
for {
// Your code logic goes here
fmt.Println("Running...")
time.Sleep(time.Second)
}
}
In this example, we create a signal channel sigChan
to receive OS signals. We use signal.Notify
to notify the channel whenever a SIGINT or SIGTERM signal is received.
We create a goroutine that listens for signals from sigChan
. When a signal is received, the goroutine performs the necessary cleanup or graceful shutdown operations. Finally, it calls os.Exit(0)
to exit the program gracefully.
The main program logic runs inside the infinite for
loop. You can replace the "Running..." print statement with your actual program logic.
Remember to import the necessary packages (os
, os/signal
, and syscall
) before running this code.
Note: It's essential to test the code on your specific operating system as handling signals and interrupts can have different behaviors on various platforms.