Unstoppable program: CSignal: interrupt not received
- Dominant language
- Go
- Stars
- 2.3k
- Forks
- 136
- Avg merge
- 14m
- Merged PRs (30d)
- 2
Description
## Summary
I am trying to run a Golang http server through python but then the program cannot be stopped.
I tried to send SIGTERM(ctrl+c)/SIGKILL(ctrl+d) signals from the terminal but it didn't work.
Sending the signal from another terminal works.
## Reproduce the error
### File structure
```bash
.
├── go.mod
├── go.sum
├── main.go
├── Makefile
├── out
└── test.py
```
### Files
#### main.go
```go
package mypackage
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func Run() {
http.HandleFunc("/", helloHandler)
http.ListenAndServe(":8080", nil)
}
```
#### Makefile
```makefile
build:
export LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:.
gopy build -output=out -vm=python3 .
```
#### test.py
```go
from out import mypackage
mypackage.Run()
```
NOTE: The example in the README.md says to first enter `out` folder, but the import does not work from inside the `out` folder
### Run the test
```bash
python3 test.py
```
Then try to stop the process with `ctrl+c` (NOTE: this interrupt signal works fine if the Go code is compiled as a regular binary and not for the binding)
## Workaround
A workaround is to run the server in a goroutine while the main thread block until it receives the signal:
```go
func Run() {
server := &http.Server{
Addr: ":8080",
Handler: http.DefaultServeMux,
}
http.HandleFunc("/", helloHandler)
// Channel to listen for OS signals
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
fmt.Printf("ListenAndServe(): %s\n", err)
}
}()
fmt.Println("Server is ready to handle requests at :8080")
<-stop // Block until we receive a signal
fmt.Println("Shutting down the server...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
fmt.Printf("Server Shutdown Failed:%+v", err)
}
fmt.Println("Server stopped")
}
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.