fix: waiter Ctrl+C not responding in interactive mode

rawmode_linux.go only cleared ICANON|ECHO but left ISIG enabled,
so the terminal driver caught Ctrl+C and generated SIGINT.
signal.Notify caught the SIGINT but no goroutine consumed the
channel, effectively swallowing the signal.

Fix: also clear ISIG so Ctrl+C is delivered as byte 0x03,
which the line editor handles with os.Exit(130). Also set
VMIN=1, VTIME=0 for proper blocking read behavior.
This commit is contained in:
2026-07-19 12:25:21 +08:00
parent 9cc8176a53
commit 22c62e26ff
2 changed files with 6 additions and 1 deletions

View File

@ -15,4 +15,7 @@ const (
TCSETS = 0x5402
ICANON = 0x2
ECHO = 0x8
ISIG = 0x1
VMIN = 6
VTIME = 5
)

View File

@ -13,7 +13,9 @@ func setRawMode(fd int) (func(), error) {
return func() {}, err
}
new := old
new.Lflag &^= ICANON | ECHO
new.Lflag &^= ICANON | ECHO | ISIG
new.Cc[VMIN] = 1
new.Cc[VTIME] = 0
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), TCSETS, uintptr(unsafe.Pointer(&new))); err != 0 {
return func() {}, err
}