From 727b82fb2b3258556c2ab6f486561922dbc3cde4 Mon Sep 17 00:00:00 2001 From: tatref Date: Mon, 18 Oct 2021 23:31:18 +0200 Subject: [PATCH 1/4] feat: /proc/sysvipc/shm --- examples/shm.rs | 34 ++++++++++++++++ src/lib.rs | 3 ++ src/sysvipc_shm.rs | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 examples/shm.rs create mode 100644 src/sysvipc_shm.rs diff --git a/examples/shm.rs b/examples/shm.rs new file mode 100644 index 00000000..3d2de3ca --- /dev/null +++ b/examples/shm.rs @@ -0,0 +1,34 @@ +#![allow(clippy::print_literal)] + +extern crate procfs; + +/// A very basic clone of `ps` on Linux, in the simple no-argument mode. +/// It shows all the processes that share the same tty as our self + +fn main() { + let shared_memory_vec = procfs::Shm::new().unwrap(); + + for shared_memory in &shared_memory_vec { + println!("key: {}, shmid: {}", shared_memory.key, shared_memory.shmid); + println!("============"); + + for prc in procfs::process::all_processes().unwrap() { + match prc.smaps() { + Ok(memory_maps) => { + for (memory_map, memory_map_data) in &memory_maps { + match memory_map.pathname { + procfs::process::MMapPath::Vsys(key) => { + if key == shared_memory.key && memory_map.inode == shared_memory.shmid { + println!("{}: {:?}", prc.pid, prc.cmdline().unwrap()); + } + } + _ => (), + } + } + } + Err(_) => continue, + } + } + println!(""); + } +} diff --git a/src/lib.rs b/src/lib.rs index d2751a55..b2778011 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -266,6 +266,9 @@ pub mod process; mod meminfo; pub use crate::meminfo::*; +mod sysvipc_shm; +pub use crate::sysvipc_shm::*; + pub mod net; mod cpuinfo; diff --git a/src/sysvipc_shm.rs b/src/sysvipc_shm.rs new file mode 100644 index 00000000..560bfdd0 --- /dev/null +++ b/src/sysvipc_shm.rs @@ -0,0 +1,96 @@ +use std::io; + +use libc::pid_t; + +use super::{FileWrapper, ProcResult}; +use std::str::FromStr; + +/// A shared memory segment parsed from `/proc/sysvipc/shm` +/// Relation with `[crate::process::process::MMapPath::Vsys]` +#[derive(Debug, Clone)] +#[allow(non_snake_case)] +pub struct Shm { + pub key: i32, + pub shmid: u64, + pub perms: u16, + /// Size in bytes + pub size: u32, + /// Creator PID + pub cpid: pid_t, + /// Last operator PID + pub lpid: pid_t, + pub nattch: u32, + pub uid: u16, + pub gid: u16, + pub cuid: u16, + pub cgid: u16, + pub atime: u64, + pub dtime: u64, + pub ctime: u64, + pub rss: u64, + pub swap: u64, +} + +impl Shm { + /// Reads and parses the `/proc/sysvipc/shm`, returning an error if there are problems. + pub fn new() -> ProcResult> { + let f = FileWrapper::open("/proc/sysvipc/shm")?; + + Shm::from_reader(f) + } + + /// Get Meminfo from a custom Read instead of the default `/proc/sysvipc/shm`. + pub fn from_reader(r: R) -> ProcResult> { + use std::io::{BufRead, BufReader}; + + let reader = BufReader::new(r); + let mut vec = Vec::new(); + + // See printing code here: + // https://elixir.bootlin.com/linux/latest/source/ipc/shm.c#L1737 + for line in reader.lines().skip(1) { + let line = expect!(line); + let mut s = line.split_whitespace(); + + let key = expect!(i32::from_str(expect!(s.next()))); + let shmid = expect!(u64::from_str(expect!(s.next()))); + let perms = expect!(u16::from_str(expect!(s.next()))); + let size = expect!(u32::from_str(expect!(s.next()))); + let cpid = expect!(pid_t::from_str(expect!(s.next()))); + let lpid = expect!(pid_t::from_str(expect!(s.next()))); + let nattch = expect!(u32::from_str(expect!(s.next()))); + let uid = expect!(u16::from_str(expect!(s.next()))); + let gid = expect!(u16::from_str(expect!(s.next()))); + let cuid = expect!(u16::from_str(expect!(s.next()))); + let cgid = expect!(u16::from_str(expect!(s.next()))); + let atime = expect!(u64::from_str(expect!(s.next()))); + let dtime = expect!(u64::from_str(expect!(s.next()))); + let ctime = expect!(u64::from_str(expect!(s.next()))); + let rss = expect!(u64::from_str(expect!(s.next()))); + let swap = expect!(u64::from_str(expect!(s.next()))); + + let shm = Shm { + key, + shmid, + perms, + size, + cpid, + lpid, + nattch, + uid, + gid, + cuid, + cgid, + atime, + dtime, + ctime, + rss, + swap, + }; + + vec.push(shm); + } + + Ok(vec) + } +} From f6ab4a571c39b2dc1501a29a50ba724de9ff7457 Mon Sep 17 00:00:00 2001 From: tatref Date: Fri, 29 Oct 2021 01:50:57 +0200 Subject: [PATCH 2/4] doc: Shm --- src/sysvipc_shm.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/sysvipc_shm.rs b/src/sysvipc_shm.rs index 560bfdd0..45b31f1e 100644 --- a/src/sysvipc_shm.rs +++ b/src/sysvipc_shm.rs @@ -10,8 +10,11 @@ use std::str::FromStr; #[derive(Debug, Clone)] #[allow(non_snake_case)] pub struct Shm { + /// Segment key pub key: i32, + /// Segment ID, unique pub shmid: u64, + /// Access permissions, as octal pub perms: u16, /// Size in bytes pub size: u32, @@ -19,15 +22,25 @@ pub struct Shm { pub cpid: pid_t, /// Last operator PID pub lpid: pid_t, + /// Number of attached processes pub nattch: u32, + /// User ID pub uid: u16, + /// Group ID pub gid: u16, + /// Creator UID pub cuid: u16, + /// Creator GID pub cgid: u16, + /// Time of last `shmat` (attach) pub atime: u64, + /// Time of last `shmdt` (detach) pub dtime: u64, + /// Time of last permission change pub ctime: u64, + /// Current part of the shared memory resident in memory pub rss: u64, + /// Current part of the shared memory in SWAP pub swap: u64, } From d86a57215eadf5efa2006bdffb7a021375ef0ee9 Mon Sep 17 00:00:00 2001 From: tatref Date: Fri, 29 Oct 2021 01:52:48 +0200 Subject: [PATCH 3/4] epoch --- src/sysvipc_shm.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sysvipc_shm.rs b/src/sysvipc_shm.rs index 45b31f1e..b7e0b39e 100644 --- a/src/sysvipc_shm.rs +++ b/src/sysvipc_shm.rs @@ -32,11 +32,11 @@ pub struct Shm { pub cuid: u16, /// Creator GID pub cgid: u16, - /// Time of last `shmat` (attach) + /// Time of last `shmat` (attach), epoch pub atime: u64, - /// Time of last `shmdt` (detach) + /// Time of last `shmdt` (detach), epoch pub dtime: u64, - /// Time of last permission change + /// Time of last permission change, epoch pub ctime: u64, /// Current part of the shared memory resident in memory pub rss: u64, From a0679242e613e4618cb92a0ed70721af218efa7d Mon Sep 17 00:00:00 2001 From: tatref Date: Sat, 6 Nov 2021 19:13:11 +0100 Subject: [PATCH 4/4] Update shm.rs --- examples/shm.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/shm.rs b/examples/shm.rs index 3d2de3ca..5123681e 100644 --- a/examples/shm.rs +++ b/examples/shm.rs @@ -2,8 +2,7 @@ extern crate procfs; -/// A very basic clone of `ps` on Linux, in the simple no-argument mode. -/// It shows all the processes that share the same tty as our self +/// List processes using posix shared memory segments fn main() { let shared_memory_vec = procfs::Shm::new().unwrap();