aboutsummaryrefslogtreecommitdiffstats
path: root/filter/files.go
diff options
context:
space:
mode:
Diffstat (limited to 'filter/files.go')
-rw-r--r--filter/files.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/filter/files.go b/filter/files.go
new file mode 100644
index 0000000..e8c0cd3
--- /dev/null
+++ b/filter/files.go
@@ -0,0 +1,102 @@
1package main
2
3import (
4 "fmt"
5 "path"
6 "sort"
7 "syscall"
8)
9
10type FileFlag struct {
11 Value uint64
12 Name string
13}
14
15var FileFlags = []FileFlag{
16 {Value: syscall.O_APPEND, Name: "O_APPEND"},
17 {Value: syscall.O_ASYNC, Name: "O_ASYNC"},
18 {Value: syscall.O_CLOEXEC, Name: "O_CLOEXEC"},
19 {Value: syscall.O_CREAT, Name: "O_CREAT"},
20 {Value: syscall.O_DIRECT, Name: "O_DIRECT"},
21 {Value: syscall.O_DIRECTORY, Name: "O_DIRECTORY"},
22 {Value: syscall.O_DSYNC, Name: "O_DSYNC"},
23 {Value: syscall.O_EXCL, Name: "O_EXCL"},
24 {Value: syscall.O_FSYNC, Name: "O_FSYNC"},
25 {Value: syscall.O_NDELAY, Name: "O_NDELAY"},
26 {Value: syscall.O_NOATIME, Name: "O_NOATIME"},
27 {Value: syscall.O_NOCTTY, Name: "O_NOCTTY"},
28 {Value: syscall.O_NOFOLLOW, Name: "O_NOFOLLOW"},
29 {Value: syscall.O_NONBLOCK, Name: "O_NONBLOCK"},
30 {Value: syscall.O_RDONLY, Name: "O_RDONLY"},
31 {Value: syscall.O_RDWR, Name: "O_RDWR"},
32 {Value: syscall.O_RSYNC, Name: "O_RSYNC"},
33 {Value: syscall.O_SYNC, Name: "O_SYNC"},
34 {Value: syscall.O_TRUNC, Name: "O_TRUNC"},
35 {Value: syscall.O_WRONLY, Name: "O_WRONLY"},
36}
37
38func filtFiles(pRawFileData *[]File) {
39 rawFileData := *pRawFileData
40 files = make([]File, 0)
41
42 // 所有文件按照特定顺序排
43 sort.Slice(rawFileData, func(i, j int) bool {
44 pi := &rawFileData[i]
45 pj := &rawFileData[j]
46
47 if pi.FileName < pj.FileName {
48 return true
49 } else if pi.FileName > pj.FileName {
50 return false
51 }
52 if pi.Pid < pj.Pid {
53 return true
54 } else if pi.Pid > pj.Pid {
55 return false
56 }
57 if pi.Fd < pj.Fd {
58 return true
59 } else if pi.Fd > pj.Fd {
60 return false
61 }
62 if pi.OpenTimestamp.Before(pj.OpenTimestamp) {
63 return true
64 } else {
65 return false
66 }
67 })
68
69 for _, file := range rawFileData {
70 tgid := findTgid[file.Pid]
71 pTgidNode, exists := helloTree[tgid]
72 if !exists {
73 continue
74 }
75 if file.CloseTimestamp.IsZero() {
76 index, exists := pTgidNode.FindPid[file.Pid]
77 if !exists || index < 0 || index >= len(pTgidNode.Threads) {
78 continue
79 }
80 file.CloseTimestamp = pTgidNode.Threads[index].ExitTimestamp
81 }
82 file.FileName = path.Clean(file.FileName)
83 files = append(files, file)
84 }
85}
86
87// 解析 Flags[1] 的值为描述性字符串
88func parseFlags(flag uint64) string {
89 var result string
90 for _, fileFlag := range FileFlags {
91 if flag&fileFlag.Value == fileFlag.Value {
92 if result != "" {
93 result += " | "
94 }
95 result += fileFlag.Name
96 }
97 }
98 if result == "" {
99 return fmt.Sprintf("0x%x", flag) // 返回原始十六进制值
100 }
101 return result
102}