Commit d21b37bb authored by Russ Cox's avatar Russ Cox

os: make Process.Signal 'process finished' error consistent on Unix

While we're here, fix the implementation of Release on both
Unix and Windows: Release is supposed to make Signal an error.

While we're here, make sure we never Signal pid 0.
(Don't try this at home.)

Fixes #7658.

LGTM=r
R=golang-codereviews, r
CC=golang-codereviews, iant
https://golang.org/cl/152240043
parent 5b829cca
...@@ -34,18 +34,26 @@ func (p *Process) wait() (ps *ProcessState, err error) { ...@@ -34,18 +34,26 @@ func (p *Process) wait() (ps *ProcessState, err error) {
return ps, nil return ps, nil
} }
var errFinished = errors.New("os: process already finished")
func (p *Process) signal(sig Signal) error { func (p *Process) signal(sig Signal) error {
if p.done() {
return errors.New("os: process already finished")
}
if p.Pid == -1 { if p.Pid == -1 {
return errors.New("os: process already released") return errors.New("os: process already released")
} }
if p.Pid == 0 {
return errors.New("os: process not initialized")
}
if p.done() {
return errFinished
}
s, ok := sig.(syscall.Signal) s, ok := sig.(syscall.Signal)
if !ok { if !ok {
return errors.New("os: unsupported signal type") return errors.New("os: unsupported signal type")
} }
if e := syscall.Kill(p.Pid, s); e != nil { if e := syscall.Kill(p.Pid, s); e != nil {
if e == syscall.ESRCH {
return errFinished
}
return e return e
} }
return nil return nil
......
...@@ -53,6 +53,9 @@ func terminateProcess(pid, exitcode int) error { ...@@ -53,6 +53,9 @@ func terminateProcess(pid, exitcode int) error {
} }
func (p *Process) signal(sig Signal) error { func (p *Process) signal(sig Signal) error {
if p.handle == uintptr(syscall.InvalidHandle) {
return syscall.EINVAL
}
if p.done() { if p.done() {
return errors.New("os: process already finished") return errors.New("os: process already finished")
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment