| // +build !windows |
| |
| package sys |
| |
| import "golang.org/x/sys/unix" |
| |
| // Exit is the wait4 information from an exited process |
| type Exit struct { |
| Pid int |
| Status int |
| } |
| |
| // Reap reaps all child processes for the calling process and returns their |
| // exit information |
| func Reap(wait bool) (exits []Exit, err error) { |
| var ( |
| ws unix.WaitStatus |
| rus unix.Rusage |
| ) |
| flag := unix.WNOHANG |
| if wait { |
| flag = 0 |
| } |
| for { |
| pid, err := unix.Wait4(-1, &ws, flag, &rus) |
| if err != nil { |
| if err == unix.ECHILD { |
| return exits, nil |
| } |
| return exits, err |
| } |
| if pid <= 0 { |
| return exits, nil |
| } |
| exits = append(exits, Exit{ |
| Pid: pid, |
| Status: exitStatus(ws), |
| }) |
| } |
| } |
| |
| const exitSignalOffset = 128 |
| |
| // exitStatus returns the correct exit status for a process based on if it |
| // was signaled or exited cleanly |
| func exitStatus(status unix.WaitStatus) int { |
| if status.Signaled() { |
| return exitSignalOffset + int(status.Signal()) |
| } |
| return status.ExitStatus() |
| } |