Skip to content

Commit d3b50c8

Browse files
feat: Added Process struct, GetProcessList API
1 parent 9b0bd0f commit d3b50c8

File tree

6 files changed

+89
-10
lines changed

6 files changed

+89
-10
lines changed

cmd/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ func main() {
1111
log.Printf("%v",cpuInfo)
1212
memInfo, err := psutils.GetMemInfo()
1313
log.Printf("%v",memInfo)
14-
log.Fatalf("err %v",err)
14+
log.Printf("err %v",err)
15+
procs, err := psutils.GetProcessList()
16+
log.Printf("%v\n",procs)
17+
log.Printf("err %v",err)
1518

1619
}

pkg/cpuInfo.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import (
77
)
88

99
type Loader interface {
10-
Load() (string, error)
10+
Load(filePath string) (string, error)
1111
}
1212

1313
type RealCpuLoader struct{}
1414

15-
func (l *RealCpuLoader) Load() (string, error) {
16-
return loadFile("/proc/cpuinfo")
15+
func (l *RealCpuLoader) Load(filePath string) (string, error) {
16+
return loadFile(filePath)
1717
}
1818

1919
type CpuInfo struct {
@@ -72,7 +72,7 @@ func GetCpuInfo() (cpuInfo CpuInfo, err error) {
7272

7373
func getCpuInfo(loader Loader) (cpuInfo CpuInfo, err error) {
7474

75-
cpuData, err := loader.Load()
75+
cpuData, err := loader.Load("/proc/cpuinfo")
7676
if err != nil {
7777
return
7878
}

pkg/cpuInfo_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cpu cores : 6
177177

178178
type spyCpuLoader struct{}
179179

180-
func (l *spyCpuLoader) Load() (string, error) {
180+
func (l *spyCpuLoader) Load(string) (string, error) {
181181
return cpuinfo, nil
182182
}
183183
func TestGetCpuInfo(t *testing.T) {

pkg/memInfo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ type MemInfo struct {
1313

1414
type RealMemLoader struct{}
1515

16-
func (l *RealMemLoader) Load() (string, error) {
17-
return loadFile("/proc/meminfo")
16+
func (l *RealMemLoader) Load(filePath string) (string, error) {
17+
return loadFile(filePath)
1818
}
1919

2020
func extractValue(line string) (valueNoKB string) {
@@ -56,7 +56,7 @@ func GetMemInfo() (memInfo MemInfo, err error) {
5656

5757
func getMemInfo(loader Loader) (memInfo MemInfo, err error) {
5858

59-
memData, err := loader.Load()
59+
memData, err := loader.Load("/proc/meminfo")
6060
if err != nil {
6161
return
6262
}

pkg/memInfo_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Inactive: 6296272 kB
1818

1919
type spyMemLoader struct{}
2020

21-
func (l *spyMemLoader) Load() (string, error) {
21+
func (l *spyMemLoader) Load(string) (string, error) {
2222
return memInfo, nil
2323
}
2424
func TestGetMemInfo(t *testing.T) {

pkg/processInfo.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package psutils
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"strconv"
7+
"strings"
8+
)
9+
10+
type Process struct {
11+
PID int
12+
ProcessName string
13+
}
14+
15+
type RealProcLoader struct{}
16+
17+
func (l *RealProcLoader) Load(filePath string) (string, error) {
18+
return loadFile(filePath)
19+
}
20+
21+
func setProcInfo(data string) (proc Process, err error) {
22+
lines := strings.SplitN(data, "\n", -1)
23+
24+
for _, line := range lines {
25+
if strings.HasPrefix(line, "Name") {
26+
parts := strings.Split(line, ":")
27+
value := strings.TrimSpace(parts[1])
28+
proc.ProcessName = value
29+
30+
} else if strings.HasPrefix(line, "Pid") {
31+
32+
parts := strings.Split(line, ":")
33+
value := strings.TrimSpace(parts[1])
34+
proc.PID, err = strconv.Atoi(value)
35+
}
36+
}
37+
return
38+
}
39+
40+
func GetProcessList() (procs []Process, err error) {
41+
var _ Loader = (*RealProcLoader)(nil)
42+
return getProcessList(&RealProcLoader{})
43+
}
44+
45+
func getProcessList(loader Loader) (procs []Process, err error) {
46+
procs = make([]Process, 0)
47+
dir, err := os.Open("/proc")
48+
if err != nil {
49+
return
50+
}
51+
defer dir.Close()
52+
53+
entries, err := dir.Readdirnames(0)
54+
if err != nil {
55+
return
56+
}
57+
58+
for _, entry := range entries {
59+
60+
_, err = strconv.Atoi(entry)
61+
if err != nil {
62+
continue
63+
}
64+
65+
statusFile := filepath.Join("/proc", entry, "status")
66+
var data string
67+
data, err = loader.Load(statusFile)
68+
if err != nil {
69+
return
70+
}
71+
var process Process
72+
process, err = setProcInfo(data)
73+
procs = append(procs, process)
74+
}
75+
return
76+
}

0 commit comments

Comments
 (0)