diff --git a/pkg/proc/gdbserial/gdbserver.go b/pkg/proc/gdbserial/gdbserver.go index 0151a631..8cea453c 100644 --- a/pkg/proc/gdbserial/gdbserver.go +++ b/pkg/proc/gdbserial/gdbserver.go @@ -573,6 +573,13 @@ func LLDBLaunch(cmd []string, wd string, flags proc.LaunchFlags, debugInfoDirs [ } else { tgt, err = p.Dial(port, cmd[0], 0, debugInfoDirs, proc.StopLaunched) } + if p.conn.pid != 0 && foreground && isatty.IsTerminal(os.Stdin.Fd()) { + // Make the target process the controlling process of the tty if it is a foreground process. + err = tcsetpgrp(os.Stdin.Fd(), p.conn.pid) + if err != nil { + logflags.DebuggerLogger().Errorf("could not set controlling process: %v", err) + } + } return tgt, err } diff --git a/pkg/proc/gdbserial/gdbserver_unix.go b/pkg/proc/gdbserial/gdbserver_unix.go index c5151bf4..d69bb38d 100644 --- a/pkg/proc/gdbserial/gdbserver_unix.go +++ b/pkg/proc/gdbserial/gdbserver_unix.go @@ -6,6 +6,8 @@ package gdbserial import ( "os/signal" "syscall" + + "golang.org/x/sys/unix" ) func sysProcAttr(foreground bool) *syscall.SysProcAttr { @@ -15,3 +17,7 @@ func sysProcAttr(foreground bool) *syscall.SysProcAttr { func foregroundSignalsIgnore() { signal.Ignore(syscall.SIGTTOU, syscall.SIGTTIN) } + +func tcsetpgrp(fd uintptr, pid int) error { + return unix.IoctlSetPointerInt(int(fd), unix.TIOCSPGRP, pid) +} diff --git a/pkg/proc/gdbserial/gdbserver_windows.go b/pkg/proc/gdbserial/gdbserver_windows.go index c23d35e1..90d82517 100644 --- a/pkg/proc/gdbserial/gdbserver_windows.go +++ b/pkg/proc/gdbserial/gdbserver_windows.go @@ -8,3 +8,7 @@ func sysProcAttr(foreground bool) *syscall.SysProcAttr { func foregroundSignalsIgnore() { } + +func tcsetpgrp(fd uintptr, pid int) error { + return nil +}