2023-03-03 07:48:01 +08:00
|
|
|
//go:build unix
|
2017-12-03 02:52:57 +08:00
|
|
|
|
|
|
|
package eval
|
|
|
|
|
|
|
|
import (
|
2018-11-18 00:53:42 +08:00
|
|
|
"os"
|
2017-12-03 02:52:57 +08:00
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
|
|
|
|
2021-01-27 09:28:38 +08:00
|
|
|
"src.elv.sh/pkg/sys"
|
2021-10-02 20:14:00 +08:00
|
|
|
"src.elv.sh/pkg/sys/eunix"
|
2017-12-03 02:52:57 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// Process control functions in Unix.
|
|
|
|
|
|
|
|
func putSelfInFg() error {
|
2022-11-21 00:16:22 +08:00
|
|
|
if !sys.IsATTY(os.Stdin.Fd()) {
|
2018-11-18 00:53:42 +08:00
|
|
|
return nil
|
|
|
|
}
|
2018-09-29 06:27:03 +08:00
|
|
|
// If Elvish is in the background, the tcsetpgrp call below will either fail
|
|
|
|
// (if the process is in an orphaned process group) or stop the process.
|
|
|
|
// Ignoring TTOU fixes that.
|
|
|
|
signal.Ignore(syscall.SIGTTOU)
|
|
|
|
defer signal.Reset(syscall.SIGTTOU)
|
2021-10-02 20:14:00 +08:00
|
|
|
return eunix.Tcsetpgrp(0, syscall.Getpgrp())
|
2017-12-03 02:52:57 +08:00
|
|
|
}
|
2017-12-04 04:46:08 +08:00
|
|
|
|
|
|
|
func makeSysProcAttr(bg bool) *syscall.SysProcAttr {
|
|
|
|
return &syscall.SysProcAttr{Setpgid: bg}
|
|
|
|
}
|