func ParsePSOutput(output []byte) (*TopResults, error) {
	topResults := &TopResults{}
	lines := strings.Split(string(output), "\n")
	topResults.Headers = fieldsASCII(lines[0])
	pidIndex := -1
	for i, name := range topResults.Headers {
		if name == "PID" {
			pidIndex = i
		}
	}
	for _, line := range lines[1:] {
		if len(line) == 0 {
			continue
		}
		fields := fieldsASCII(line)
		if fields[pidIndex] == "-" {
			continue
		}
		process := fields[:len(topResults.Headers)-1]
		process = append(process, strings.Join(fields[len(topResults.Headers)-1:], " "))
		topResults.Processes = append(topResults.Processes, process)
	}
	return topResults, nil
}
ParsePSOutput parses the runtime's ps raw output and returns a TopResults
package runc
import (
	"bytes"
	"io/ioutil"
	"strconv"
	"strings"
	"sync"
	"syscall"
)
func ReadPidFile(path string) (int, error) {
	data, err := ioutil.ReadFile(path)
	if err != nil {
		return -1, err
	}
	return strconv.Atoi(string(data))
}
const exitSignalOffset = 128
func exitStatus(status syscall.WaitStatus) int {
	if status.Signaled() {
		return exitSignalOffset + int(status.Signal())
	}
	return status.ExitStatus()
}
var bytesBufferPool = sync.Pool{
	New: func() interface{} {
		return bytes.NewBuffer(nil)
	},
}
func getBuf() *bytes.Buffer {
	return bytesBufferPool.Get().(*bytes.Buffer)
}
func putBuf(b *bytes.Buffer) {
	if b == nil {
		return
	}
	b.Reset()
	bytesBufferPool.Put(b)
}
func fieldsASCII(s string) []string {
	fn := func(r rune) bool {
		switch r {
		case '\t', '\n', '\f', '\r', ' ':
			return true
		}
		return false
	}
	return strings.FieldsFunc(s, fn)
}