fix bg/fg implementations
This commit is contained in:
parent
b5c7162555
commit
37c56cb322
1 changed files with 14 additions and 9 deletions
|
|
@ -30,6 +30,8 @@ import (
|
|||
|
||||
var bgProcs = make([]*exec.Cmd, 0)
|
||||
var LastExitCode int
|
||||
var sigs = []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGTSTP, syscall.SIGTTIN, syscall.SIGTTOU, syscall.SIGCONT}
|
||||
|
||||
|
||||
func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
||||
if in == nil {
|
||||
|
|
@ -63,7 +65,7 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stdin = os.Stdin
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
signal.Notify(signalChan, sigs...)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
|
|
@ -71,7 +73,7 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
|
||||
err = cmd.Run()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
signal.Reset(sigs...)
|
||||
if err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
LastExitCode = exitError.ExitCode()
|
||||
|
|
@ -113,7 +115,12 @@ func bgcall(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stderr = os.Stderr
|
||||
|
||||
bgProcs = append(bgProcs, cmd)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stdin = os.Stdin
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
cmd.Start()
|
||||
cmd.Process.Signal(syscall.SIGTSTP)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -125,19 +132,17 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd := bgProcs[0]
|
||||
bgProcs = bgProcs[1:]
|
||||
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stdin = os.Stdin
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
signal.Notify(signalChan, sigs...)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
}()
|
||||
|
||||
cmd.Process.Signal(syscall.SIGCONT)
|
||||
err := cmd.Wait()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
signal.Reset(sigs...)
|
||||
if err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
LastExitCode = exitError.ExitCode()
|
||||
|
|
@ -182,7 +187,7 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stdin = os.Stdin
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
signal.Notify(signalChan, sigs...)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
|
|
@ -190,7 +195,7 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
|
||||
err = cmd.Run()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
signal.Reset(sigs...)
|
||||
if err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
LastExitCode = exitError.ExitCode()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue