1
0
mirror of https://github.com/golang/go synced 2024-11-18 16:04:44 -07:00

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
This commit is contained in:
Russ Cox 2014-10-06 15:49:19 -04:00
parent 5b829cca12
commit d21b37bbe7
2 changed files with 14 additions and 3 deletions

View File

@ -34,18 +34,26 @@ func (p *Process) wait() (ps *ProcessState, err error) {
return ps, nil
}
var errFinished = errors.New("os: process already finished")
func (p *Process) signal(sig Signal) error {
if p.done() {
return errors.New("os: process already finished")
}
if p.Pid == -1 {
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)
if !ok {
return errors.New("os: unsupported signal type")
}
if e := syscall.Kill(p.Pid, s); e != nil {
if e == syscall.ESRCH {
return errFinished
}
return e
}
return nil

View File

@ -53,6 +53,9 @@ func terminateProcess(pid, exitcode int) error {
}
func (p *Process) signal(sig Signal) error {
if p.handle == uintptr(syscall.InvalidHandle) {
return syscall.EINVAL
}
if p.done() {
return errors.New("os: process already finished")
}