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:
parent
5b829cca12
commit
d21b37bbe7
@ -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
|
||||
|
@ -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")
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user