2014-07-06 07:05:32 +00:00
|
|
|
package procfs
|
2014-07-06 06:59:58 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ProcPidStatm contains process information obtained from /proc/[PID]/statm
|
|
|
|
// Its fields are documented using PROC(5) man page
|
|
|
|
type ProcPidStatm struct {
|
|
|
|
Size uint64 // Total program size
|
|
|
|
Resident uint64 // Resident set size
|
|
|
|
Share uint64 // Shared pages
|
|
|
|
Text uint64 // Text (code)
|
|
|
|
Lib uint64 // Library (unused in Linux 2.6)
|
|
|
|
Data uint64 // Data + Stack
|
|
|
|
Dt uint64 // Dirty pages (unused in Linux 2.6)
|
|
|
|
}
|
|
|
|
|
2014-07-15 07:35:19 +00:00
|
|
|
func NewProcPidStatm(pid int) (ProcPidStatm, error) {
|
|
|
|
p := ProcPidStatm{}
|
|
|
|
|
2014-07-06 06:59:58 +00:00
|
|
|
file := fmt.Sprintf("/proc/%d/statm", pid)
|
2014-07-06 13:49:20 +00:00
|
|
|
b, err := ioutil.ReadFile(file)
|
2014-07-06 06:59:58 +00:00
|
|
|
if err != nil {
|
2014-07-15 07:35:19 +00:00
|
|
|
return p, err
|
2014-07-06 06:59:58 +00:00
|
|
|
}
|
|
|
|
|
2014-07-06 13:49:20 +00:00
|
|
|
parsed, err := fmt.Sscanf(string(b), "%d %d %d %d %d %d %d",
|
2014-07-06 06:59:58 +00:00
|
|
|
&p.Size, &p.Resident, &p.Share, &p.Text, &p.Lib, &p.Data, &p.Dt)
|
|
|
|
|
|
|
|
if parsed < 7 {
|
2014-07-15 07:35:19 +00:00
|
|
|
err := fmt.Errorf("Managed to parse only %d fields out of 7", parsed)
|
|
|
|
return p, err
|
2014-07-06 06:59:58 +00:00
|
|
|
}
|
|
|
|
if err != nil {
|
2014-07-15 07:35:19 +00:00
|
|
|
return p, err
|
2014-07-06 06:59:58 +00:00
|
|
|
}
|
|
|
|
|
2014-07-15 07:35:19 +00:00
|
|
|
return p, nil
|
2014-07-06 06:59:58 +00:00
|
|
|
}
|