     1	package main
     2	
     3	import (
     4	    "fmt"
     5	    "exec"
     6	    "bufio"
     7	    "log"
     8	    "strings"
     9	    "strconv"
    10	    "sort"
    11	    "container/vector"
    12	)
    13	
    14	func main() {
    15	    child := map[int]vector.IntVector{}
    16	    cmd, err := exec.Run("/bin/ps", []string{"/bin/ps", "-e", "-opid,ppid"}, []string{}, "", exec.Pipe, exec.Pipe, exec.Pipe)
    17	    if err != nil {
    18	        log.Exit(err)
    19	    }
    20	
    21	    reader := bufio.NewReader(cmd.Stdout)
    22	    str, err := reader.ReadString('\n')
    23	    for err == nil {
    24	        fields := strings.Fields(str)
    25	        if pid, err := strconv.Atoi(fields[0]); err == nil {
    26	            if parent, err := strconv.Atoi(fields[1]); err == nil {
    27	                tmp := child[parent]
    28	                tmp.Push(pid)
    29	                child[parent] = tmp
    30	            }
    31	        }
    32	        str, err = reader.ReadString('\n')
    33	    }
    34	
    35	    keys := vector.IntVector{}
    36	    for k := range child {
    37	        keys.Push(k)
    38	    }
    39	    sort.Sort(&keys)
    40	    for _, i := range keys {
    41	        vector := child[i]
    42	        append := "ren"
    43	        if vector.Len() == 1 {
    44	            append = ""
    45	        }
    46	        childlist := ""
    47	        for i := 0; i < vector.Len(); i++ {
    48	            childlist += fmt.Sprintf("%d, ", vector.At(i))
    49	        }
    50	        fmt.Printf("PID %d has %d child%s: %s\n", i, vector.Len(), append, childlist[0:len(childlist) - 2])
    51	    }
    52	}
