in below/procfs/src/lib.rs [501:552]
fn read_pid_stat_from_path<P: AsRef<Path>>(&self, path: P) -> Result<PidStat> {
let path = path.as_ref().join("stat");
let file = File::open(&path).map_err(|e| Error::IoError(path.clone(), e))?;
let mut buf_reader = BufReader::new(file);
let mut pidstat: PidStat = Default::default();
let mut line = String::new();
buf_reader
.read_line(&mut line)
.map_err(|e| Error::IoError(path.clone(), e))?;
{
let b_opt = line.find('(');
let e_opt = line.rfind(')');
if let (Some(b), Some(e)) = (b_opt, e_opt) {
pidstat.comm = Some(line[b + 1..e].to_string());
line.replace_range(b..e + 1, "");
}
}
let items: Vec<_> = line.split_whitespace().collect();
pidstat.pid = parse_item!(path, items.get(0), i32, line)?;
if let Some(c) = parse_item!(path, items.get(1), char, line)? {
if let Some(state) = PidState::from_char(c) {
pidstat.state = Some(state);
} else {
return Err(Error::InvalidPidState(path, c));
}
}
pidstat.ppid = parse_item!(path, items.get(2), i32, line)?;
pidstat.pgrp = parse_item!(path, items.get(3), i32, line)?;
pidstat.session = parse_item!(path, items.get(4), i32, line)?;
pidstat.minflt = parse_item!(path, items.get(8), u64, line)?;
pidstat.majflt = parse_item!(path, items.get(10), u64, line)?;
pidstat.user_usecs = parse_usec!(path, items.get(12), line)?;
pidstat.system_usecs = parse_usec!(path, items.get(13), line)?;
pidstat.num_threads = parse_item!(path, items.get(18), u64, line)?;
let uptime = self.read_uptime_secs()?;
pidstat.running_secs = parse_sec!(path, items.get(20), line)?
.map(|running_secs_since_boot| (uptime - running_secs_since_boot) as u64);
pidstat.rss_bytes =
parse_item!(path, items.get(22), u64, line)?.map(|pages| pages * *PAGE_SIZE);
pidstat.processor = parse_item!(path, items.get(37), i32, line)?;
if pidstat == Default::default() {
Err(Error::InvalidFileFormat(path))
} else {
Ok(pidstat)
}
}