diff options
Diffstat (limited to 'src/deal.go')
-rw-r--r-- | src/deal.go | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/deal.go b/src/deal.go new file mode 100644 index 0000000..fd9f788 --- /dev/null +++ b/src/deal.go | |||
@@ -0,0 +1,97 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "time" | ||
6 | ) | ||
7 | |||
8 | func deal() { | ||
9 | defer wg.Done() | ||
10 | var cooked Event | ||
11 | var ok bool | ||
12 | for { | ||
13 | cooked, ok = <-cookedChan | ||
14 | if !ok { | ||
15 | break | ||
16 | } | ||
17 | // type Event struct { | ||
18 | // timestamp time.Time | ||
19 | // pid, ppid int | ||
20 | // syscall int | ||
21 | // argc int | ||
22 | // args []string | ||
23 | // cwd string | ||
24 | // } | ||
25 | // type process struct { | ||
26 | // timestamp time.Time | ||
27 | // pid, ppid int | ||
28 | // argv []string | ||
29 | // cwd string | ||
30 | // rootfs string | ||
31 | // children []int | ||
32 | // } | ||
33 | switch syscallTable[cooked.syscall] { | ||
34 | case "fork", "vfork", "clone": | ||
35 | ppid := cooked.ppid | ||
36 | pid := cooked.pid | ||
37 | parent, ok := pids.Load(ppid) | ||
38 | if !ok { | ||
39 | break | ||
40 | } | ||
41 | parent.(*process).children = append(parent.(*process).children, pid) | ||
42 | pids.Store(pid, &process{ | ||
43 | timestamp: cooked.timestamp, | ||
44 | pid: cooked.pid, | ||
45 | ppid: cooked.ppid, | ||
46 | argv: cooked.argv, | ||
47 | cwd: cooked.cwd, | ||
48 | children: make([]int, 0), | ||
49 | }) | ||
50 | fmt.Printf("%v syscall=%d, ppid=%d, pid=%d, cwd=\"%s\", argc=%d, ", cooked.timestamp, cooked.syscall, cooked.ppid, cooked.pid, cooked.cwd, cooked.argc) | ||
51 | for i := 0; i < cooked.argc; i++ { | ||
52 | fmt.Printf("arg[%d]=\"%s\", ", i, cooked.argv[i]) | ||
53 | } | ||
54 | fmt.Printf("\n") | ||
55 | case "exit", "exit_group": | ||
56 | _, ok := pids.Load(cooked.pid) | ||
57 | if !ok { | ||
58 | break | ||
59 | } | ||
60 | go deletePid(cooked) | ||
61 | } | ||
62 | } | ||
63 | } | ||
64 | |||
65 | func deletePid(cooked Event) { | ||
66 | time.Sleep(1 * time.Second) | ||
67 | Process, ok := pids.Load(cooked.pid) | ||
68 | if !ok { | ||
69 | return | ||
70 | } | ||
71 | pProcess := Process.(*process) | ||
72 | |||
73 | // 先从爹那里注销户籍 | ||
74 | parent, ok := pids.Load(pProcess.ppid) | ||
75 | if ok { | ||
76 | pParent := parent.(*process) | ||
77 | for i, child := range pParent.children { | ||
78 | if child == pProcess.pid { | ||
79 | pParent.children = append(pParent.children[:i], pParent.children[i+1:]...) | ||
80 | break | ||
81 | } | ||
82 | } | ||
83 | } | ||
84 | |||
85 | // 子进程需要收容 | ||
86 | for i := 0; i < len(pProcess.children); i++ { | ||
87 | child, ok := pids.Load(pProcess.children[i]) | ||
88 | if ok { | ||
89 | child.(*process).ppid = 1 | ||
90 | } | ||
91 | } | ||
92 | |||
93 | // 可以去死了 | ||
94 | pids.Delete(cooked.pid) | ||
95 | _, ok = pids.Load(cooked.pid) | ||
96 | fmt.Printf("%v Goodbye, %d! ok = %v\n", time.Now(), cooked.pid, ok) | ||
97 | } | ||