From 3db0c4fed2011b3b00deb66eb870d3d1b5b28e68 Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 18 May 2023 21:59:38 +0200 Subject: [PATCH] apps: Add ps --- apps/CMakeLists.txt | 1 + apps/ps.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 apps/ps.cpp diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 99d3ddfe..9dec132e 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -26,3 +26,4 @@ luna_app(login.cpp login) luna_app(ipc-test.cpp ipc-test) luna_app(mount.cpp mount) luna_app(umount.cpp umount) +luna_app(ps.cpp ps) diff --git a/apps/ps.cpp b/apps/ps.cpp new file mode 100644 index 00000000..fe78f9e1 --- /dev/null +++ b/apps/ps.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include + +Result luna_main(int argc, char** argv) +{ + os::ArgumentParser parser; + parser.add_description("Show a list of processes on the system."); + parser.add_system_program_info("ps"_sv); + parser.parse(argc, argv); + + os::println("UID PID PPID TIME CMD"); + + pid_t last = pstat(-1, nullptr); + for (pid_t pid = 1; pid <= last; pid++) + { + static process ps; + if (pstat(pid, &ps) < 0) + { + if (errno == ESRCH) continue; + return err(errno); + } + + struct tm tm; + gmtime_r(&ps.ps_time.tv_sec, &tm); + + char timebuf[256]; + strftime(timebuf, sizeof(timebuf), "%H:%M:%S", &tm); + + const char* user = "???"; + + passwd* pw = getpwuid(ps.ps_uid); + if (pw) user = pw->pw_name; + + os::println("%-8s %6d %6d %10s %s", user, ps.ps_pid, ps.ps_ppid, timebuf, ps.ps_name); + } + + endpwent(); + + return 0; +}