Merge pull request #3357 from niten94/shell-sigint-recv

Receive SIGINT only in RunInteractiveShell
This commit is contained in:
Dmytro Maluka 2024-06-28 10:37:41 +02:00 committed by GitHub
commit dc7759204b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 18 deletions

View File

@ -40,8 +40,7 @@ var (
flagClean = flag.Bool("clean", false, "Clean configuration directory") flagClean = flag.Bool("clean", false, "Clean configuration directory")
optionFlags map[string]*string optionFlags map[string]*string
sigterm chan os.Signal sighup chan os.Signal
sighup chan os.Signal
timerChan chan func() timerChan chan func()
) )
@ -360,9 +359,9 @@ func main() {
screen.Events = make(chan tcell.Event) screen.Events = make(chan tcell.Event)
sigterm = make(chan os.Signal, 1) util.Sigterm = make(chan os.Signal, 1)
sighup = make(chan os.Signal, 1) sighup = make(chan os.Signal, 1)
signal.Notify(sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT) signal.Notify(util.Sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT)
signal.Notify(sighup, syscall.SIGHUP) signal.Notify(sighup, syscall.SIGHUP)
timerChan = make(chan func()) timerChan = make(chan func())
@ -437,7 +436,7 @@ func DoEvent() {
} }
} }
os.Exit(0) os.Exit(0)
case <-sigterm: case <-util.Sigterm:
for _, b := range buffer.OpenBuffers { for _, b := range buffer.OpenBuffers {
if !b.Modified() { if !b.Modified() {
b.Fini() b.Fini()

View File

@ -11,6 +11,7 @@ import (
shellquote "github.com/kballard/go-shellquote" shellquote "github.com/kballard/go-shellquote"
"github.com/zyedidia/micro/v2/internal/screen" "github.com/zyedidia/micro/v2/internal/screen"
"github.com/zyedidia/micro/v2/internal/util"
) )
// ExecCommand executes a command using exec // ExecCommand executes a command using exec
@ -95,28 +96,30 @@ func RunInteractiveShell(input string, wait bool, getOutput bool) (string, error
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
// This is a trap for Ctrl-C so that it doesn't kill micro // This is a trap for Ctrl-C so that it doesn't kill micro
// Instead we trap Ctrl-C to kill the program we're running // micro is killed if the signal is ignored only on Windows, so it is
// received
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
signal.Reset(os.Interrupt)
signal.Notify(c, os.Interrupt) signal.Notify(c, os.Interrupt)
go func() { err = cmd.Start()
for range c { if err == nil {
cmd.Process.Kill() err = cmd.Wait()
if wait {
// This is just so we don't return right away and let the user press enter to return
screen.TermMessage("")
} }
}() } else {
screen.TermMessage(err)
cmd.Start() }
err = cmd.Wait()
output := outputBytes.String() output := outputBytes.String()
if wait {
// This is just so we don't return right away and let the user press enter to return
screen.TermMessage("")
}
// Start the screen back up // Start the screen back up
screen.TempStart(screenb) screen.TempStart(screenb)
signal.Notify(util.Sigterm, os.Interrupt)
signal.Stop(c)
return output, err return output, err
} }

View File

@ -41,6 +41,8 @@ var (
// Stdout is a buffer that is written to stdout when micro closes // Stdout is a buffer that is written to stdout when micro closes
Stdout *bytes.Buffer Stdout *bytes.Buffer
// Sigterm is a channel where micro exits when written
Sigterm chan os.Signal
) )
func init() { func init() {