github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/processes/bgfg_unix.go (about) 1 //go:build !windows && !plan9 && !js 2 // +build !windows,!plan9,!js 3 4 package processes 5 6 import ( 7 "errors" 8 "syscall" 9 10 "github.com/lmorg/murex/lang" 11 "github.com/lmorg/murex/lang/state" 12 "github.com/lmorg/murex/lang/types" 13 ) 14 15 func mkbg(p *lang.Process) error { 16 fid, err := p.Parameters.Uint32(0) 17 if err != nil { 18 return errors.New("invalid parameters. Expecting either a code block or FID of a stopped process") 19 } 20 21 f, err := lang.GlobalFIDs.Proc(fid) 22 if err != nil { 23 return err 24 } 25 26 if f.State.Get() != state.Stopped { 27 return errors.New("FID is not a stopped process. Run `jobs` or `fid-list` to see a list of stopped processes") 28 } 29 30 pid, cmd := f.Exec.Get() 31 if pid > 0 && cmd != nil { 32 err = cmd.Process.Signal(syscall.SIGCONT) 33 if err != nil { 34 return err 35 } 36 } 37 go unstop(f) 38 39 updateTree(f, true) 40 41 f.State.Set(state.Executing) 42 43 lang.ShowPrompt <- true 44 return nil 45 } 46 47 func cmdForeground(p *lang.Process) error { 48 p.Stdout.SetDataType(types.Null) 49 50 fid, err := p.Parameters.Uint32(0) 51 if err != nil { 52 return err 53 } 54 55 f, err := lang.GlobalFIDs.Proc(fid) 56 if err != nil { 57 return err 58 } 59 60 lang.HidePrompt <- true 61 62 pid, cmd := f.Exec.Get() 63 if pid > 0 && cmd != nil { 64 err = cmd.Process.Signal(syscall.SIGCONT) 65 if err != nil { 66 return err 67 } 68 } 69 go unstop(f) 70 71 updateTree(f, false) 72 73 lang.ForegroundProc.Set(f) 74 75 f.State.Set(state.Executing) 76 <-f.Context.Done() 77 return nil 78 } 79 80 func unstop(p *lang.Process) { 81 p.WaitForStopped <- true 82 }