mirror of
https://github.com/golang/go
synced 2024-11-18 18:34:40 -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
|
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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user