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 }