sysutils: basic ps utility

This commit is contained in:
Mark Poliakov 2025-03-02 13:00:38 +02:00
parent 1b2b41406a
commit 6f8fce3388
3 changed files with 65 additions and 0 deletions

View File

@ -133,6 +133,10 @@ path = "src/sleep.rs"
name = "lspci"
path = "src/lspci.rs"
[[bin]]
name = "ps"
path = "src/ps.rs"
[[bin]]
name = "tst"
path = "src/tst.rs"

View File

@ -0,0 +1,60 @@
use std::{fs, io, path::PathBuf, process::ExitCode};
#[derive(Debug)]
struct ProcessInfo {
pid: u32,
name: String,
}
fn list_processes() -> io::Result<Vec<u32>> {
let mut list = vec![];
for entry in fs::read_dir("/sys/proc")? {
let Ok(entry) = entry else {
continue;
};
let filename = entry.file_name();
let Some(name) = filename.to_str() else {
continue;
};
let Ok(pid) = name.parse() else {
continue;
};
list.push(pid);
}
Ok(list)
}
fn process_info(pid: u32) -> io::Result<ProcessInfo> {
let base = PathBuf::from("/sys/proc").join(format!("{pid}"));
let name = fs::read_to_string(base.join("name"))?;
Ok(ProcessInfo { pid, name })
}
fn processes() -> io::Result<Vec<ProcessInfo>> {
let pids = list_processes()?;
let processes = pids
.into_iter()
.filter_map(|pid| process_info(pid).ok())
.collect();
Ok(processes)
}
fn run() -> io::Result<()> {
let mut processes = processes()?;
processes.sort_by(|a, b| Ord::cmp(&a.pid, &b.pid));
println!("{:>4} NAME", "PID");
for process in processes {
println!("{:4} {}", process.pid, process.name.trim());
}
Ok(())
}
fn main() -> ExitCode {
match run() {
Ok(()) => ExitCode::SUCCESS,
Err(error) => {
eprintln!("{error}");
ExitCode::FAILURE
}
}
}

View File

@ -48,6 +48,7 @@ const PROGRAMS: &[(&str, &str)] = &[
("sync", "bin/sync"),
("sleep", "bin/sleep"),
("lspci", "bin/lspci"),
("ps", "bin/ps"),
("tst", "bin/tst"),
// netutils
("netconf", "sbin/netconf"),