...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "fmt"
18 "os"
19 "strconv"
20
21 fsi "github.com/prometheus/procfs/internal/fs"
22 )
23
24
25
26
27
28
29 func AllThreads(pid int) (Procs, error) {
30 fs, err := NewFS(DefaultMountPoint)
31 if err != nil {
32 return Procs{}, err
33 }
34 return fs.AllThreads(pid)
35 }
36
37
38 func (fs FS) AllThreads(pid int) (Procs, error) {
39 taskPath := fs.proc.Path(strconv.Itoa(pid), "task")
40 d, err := os.Open(taskPath)
41 if err != nil {
42 return Procs{}, err
43 }
44 defer d.Close()
45
46 names, err := d.Readdirnames(-1)
47 if err != nil {
48 return Procs{}, fmt.Errorf("%s: could not read %q: %w", ErrFileRead, d.Name(), err)
49 }
50
51 t := Procs{}
52 for _, n := range names {
53 tid, err := strconv.ParseInt(n, 10, 64)
54 if err != nil {
55 continue
56 }
57
58 t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.isReal}})
59 }
60
61 return t, nil
62 }
63
64
65 func (fs FS) Thread(pid, tid int) (Proc, error) {
66 taskPath := fs.proc.Path(strconv.Itoa(pid), "task")
67 if _, err := os.Stat(taskPath); err != nil {
68 return Proc{}, err
69 }
70 return Proc{PID: tid, fs: FS{fsi.FS(taskPath), fs.isReal}}, nil
71 }
72
73
74 func (proc Proc) Thread(tid int) (Proc, error) {
75 tfs := FS{fsi.FS(proc.path("task")), proc.fs.isReal}
76 if _, err := os.Stat(tfs.proc.Path(strconv.Itoa(tid))); err != nil {
77 return Proc{}, err
78 }
79 return Proc{PID: tid, fs: tfs}, nil
80 }
81
View as plain text