package os
import (
"errors"
"runtime"
"syscall"
"time"
)
func (p *Process ) wait () (ps *ProcessState , err error ) {
if p .Pid == -1 {
return nil , syscall .EINVAL
}
ready , err := p .blockUntilWaitable ()
if err != nil {
return nil , err
}
if ready {
p .setDone ()
p .sigMu .Lock ()
p .sigMu .Unlock ()
}
var (
status syscall .WaitStatus
rusage syscall .Rusage
pid1 int
e error
)
for {
pid1 , e = syscall .Wait4 (p .Pid , &status , 0 , &rusage )
if e != syscall .EINTR {
break
}
}
if e != nil {
return nil , NewSyscallError ("wait" , e )
}
if pid1 != 0 {
p .setDone ()
}
ps = &ProcessState {
pid : pid1 ,
status : status ,
rusage : &rusage ,
}
return ps , nil
}
func (p *Process ) signal (sig Signal ) error {
if p .Pid == -1 {
return errors .New ("os: process already released" )
}
if p .Pid == 0 {
return errors .New ("os: process not initialized" )
}
p .sigMu .RLock ()
defer p .sigMu .RUnlock ()
if p .done () {
return ErrProcessDone
}
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 ErrProcessDone
}
return e
}
return nil
}
func (p *Process ) release () error {
p .Pid = -1
runtime .SetFinalizer (p , nil )
return nil
}
func findProcess (pid int ) (p *Process , err error ) {
return newProcess (pid , 0 ), nil
}
func (p *ProcessState ) userTime () time .Duration {
return time .Duration (p .rusage .Utime .Nano ()) * time .Nanosecond
}
func (p *ProcessState ) systemTime () time .Duration {
return time .Duration (p .rusage .Stime .Nano ()) * time .Nanosecond
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .