diff options
author | We-unite <3205135446@qq.com> | 2024-07-19 17:02:11 +0800 |
---|---|---|
committer | We-unite <3205135446@qq.com> | 2024-07-19 17:05:29 +0800 |
commit | 7cf8e470471d30fc821a8be350dcb97dc64e5add (patch) | |
tree | e747afbc698bba079047f17674eef260a4c6733d /src/deal.go | |
parent | 2e37dcf708be08dff963ee08cb7a9557f32e690d (diff) | |
download | godo-7cf8e470471d30fc821a8be350dcb97dc64e5add.tar.gz godo-7cf8e470471d30fc821a8be350dcb97dc64e5add.zip |
Depart the whole program into several files.
Put all the src code in only one file is to ugly, so devide it!
and mv them into src dir to keep the whole repo clear.
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 | } | ||