mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-22 01:48:11 +00:00
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:
@ -15,4 +15,7 @@ const (
|
|||||||
TCSETS = 0x5402
|
TCSETS = 0x5402
|
||||||
ICANON = 0x2
|
ICANON = 0x2
|
||||||
ECHO = 0x8
|
ECHO = 0x8
|
||||||
|
ISIG = 0x1
|
||||||
|
VMIN = 6
|
||||||
|
VTIME = 5
|
||||||
)
|
)
|
||||||
|
|||||||
@ -13,7 +13,9 @@ func setRawMode(fd int) (func(), error) {
|
|||||||
return func() {}, err
|
return func() {}, err
|
||||||
}
|
}
|
||||||
new := old
|
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 {
|
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), TCSETS, uintptr(unsafe.Pointer(&new))); err != 0 {
|
||||||
return func() {}, err
|
return func() {}, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user