diff options
author | Russ Cox <rsc@golang.org> | 2014-11-19 14:16:12 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-11-19 14:16:12 -0500 |
commit | 880ebd0ce5e22be226cb6a3a6afd4cdc421f636c (patch) | |
tree | ea0a68f707af1d805c612090ad5f76bbf6b8d9dc /src/syscall | |
parent | c1f8c907e222448ad705cc8cd00502925f23c140 (diff) | |
download | go-880ebd0ce5e22be226cb6a3a6afd4cdc421f636c.tar.gz |
undo CL 131750044 / 2d6d44ceb80e
Breaks reading from stdin in parent after exec with SysProcAttr{Setpgid: true}.
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("true")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Run()
fmt.Printf("Hit enter:")
os.Stdin.Read(make([]byte, 100))
fmt.Printf("Bye\n")
}
In go1.3, I type enter at the prompt and the program exits.
With the CL being rolled back, the program wedges at the
prompt.
??? original CL description
syscall: SysProcAttr job control changes
Making the child's process group the foreground process group and
placing the child in a specific process group involves co-ordination
between the parent and child that must be done post-fork but pre-exec.
LGTM=iant
R=golang-codereviews, gobot, iant, mikioh.mikioh
CC=golang-codereviews
https://codereview.appspot.com/131750044
Committer: Ian Lance Taylor <iant@golang.org>
???
LGTM=minux, dneil
R=dneil, minux
CC=golang-codereviews, iant, michael.p.macinnis
https://codereview.appspot.com/174450043
Diffstat (limited to 'src/syscall')
-rw-r--r-- | src/syscall/exec_bsd.go | 40 | ||||
-rw-r--r-- | src/syscall/exec_linux.go | 36 |
2 files changed, 3 insertions, 73 deletions
diff --git a/src/syscall/exec_bsd.go b/src/syscall/exec_bsd.go index 7c2c1f707..ff78f197f 100644 --- a/src/syscall/exec_bsd.go +++ b/src/syscall/exec_bsd.go @@ -19,8 +19,6 @@ type SysProcAttr struct { Setpgid bool // Set process group ID to new pid (SYSV setpgrp) Setctty bool // Set controlling terminal to fd 0 Noctty bool // Detach fd 0 from controlling terminal - Foreground bool // Set foreground process group to child's pid. (Implies Setpgid. Stdin should be a TTY) - Joinpgrp int // If != 0, child's process group ID. (Setpgid must not be set) } // Implemented in runtime package. @@ -81,22 +79,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr if r1 != 0 { // parent; return PID runtime_AfterFork() - pid = int(r1) - - if sys.Joinpgrp != 0 { - // Place the child in the specified process group. - RawSyscall(SYS_SETPGID, r1, uintptr(sys.Joinpgrp), 0) - } else if sys.Foreground || sys.Setpgid { - // Place the child in a new process group. - RawSyscall(SYS_SETPGID, 0, 0, 0) - - if sys.Foreground { - // Set new foreground process group. - RawSyscall(SYS_IOCTL, uintptr(Stdin), TIOCSPGRP, uintptr(unsafe.Pointer(&pid))) - } - } - - return pid, 0 + return int(r1), 0 } // Fork succeeded, now in child. @@ -118,30 +101,11 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr } // Set process group - if sys.Joinpgrp != 0 { - // Place the child in the specified process group. - _, _, err1 = RawSyscall(SYS_SETPGID, r1, uintptr(sys.Joinpgrp), 0) - if err1 != 0 { - goto childerror - } - } else if sys.Foreground || sys.Setpgid { - // Place the child in a new process group. + if sys.Setpgid { _, _, err1 = RawSyscall(SYS_SETPGID, 0, 0, 0) if err1 != 0 { goto childerror } - - if sys.Foreground { - r1, _, _ = RawSyscall(SYS_GETPID, 0, 0, 0) - - pid := int(r1) - - // Set new foreground process group. - _, _, err1 = RawSyscall(SYS_IOCTL, uintptr(Stdin), TIOCSPGRP, uintptr(unsafe.Pointer(&pid))) - if err1 != 0 { - goto childerror - } - } } // Chroot diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index 72e2f0b69..042c20a46 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -29,8 +29,6 @@ type SysProcAttr struct { Ctty int // Controlling TTY fd (Linux only) Pdeathsig Signal // Signal that the process will get when its parent dies (Linux only) Cloneflags uintptr // Flags for clone calls (Linux only) - Foreground bool // Set foreground process group to child's pid. (Implies Setpgid. Stdin should be a TTY) - Joinpgrp int // If != 0, child's process group ID. (Setpgid must not be set) UidMappings []SysProcIDMap // User ID mappings for user namespaces. GidMappings []SysProcIDMap // Group ID mappings for user namespaces. } @@ -105,19 +103,6 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr Close(p[1]) } - if sys.Joinpgrp != 0 { - // Place the child in the specified process group. - RawSyscall(SYS_SETPGID, r1, uintptr(sys.Joinpgrp), 0) - } else if sys.Foreground || sys.Setpgid { - // Place the child in a new process group. - RawSyscall(SYS_SETPGID, 0, 0, 0) - - if sys.Foreground { - // Set new foreground process group. - RawSyscall(SYS_IOCTL, uintptr(Stdin), TIOCSPGRP, uintptr(unsafe.Pointer(&pid))) - } - } - return pid, 0 } @@ -179,30 +164,11 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr } // Set process group - if sys.Joinpgrp != 0 { - // Place the child in the specified process group. - _, _, err1 = RawSyscall(SYS_SETPGID, r1, uintptr(sys.Joinpgrp), 0) - if err1 != 0 { - goto childerror - } - } else if sys.Foreground || sys.Setpgid { - // Place the child in a new process group. + if sys.Setpgid { _, _, err1 = RawSyscall(SYS_SETPGID, 0, 0, 0) if err1 != 0 { goto childerror } - - if sys.Foreground { - r1, _, _ = RawSyscall(SYS_GETPID, 0, 0, 0) - - pid := int(r1) - - // Set new foreground process group. - _, _, err1 = RawSyscall(SYS_IOCTL, uintptr(Stdin), TIOCSPGRP, uintptr(unsafe.Pointer(&pid))) - if err1 != 0 { - goto childerror - } - } } // Chroot |