Htop Clone System Monitor - C Implementation Specification - rtop
Project Overview
Create a terminal-based system monitoring tool in C that replicates htop's visual interface and functionality. The tool displays comprehensive system statistics in a dynamic, auto-refreshing interface with no external dependencies or interactive actions. The application name will be rtop.
Core Requirements
Language & Constraints
- Implementation language: C (C99 or later)
- No external library dependencies beyond standard C library
- Single binary compilation with no runtime dependencies
- Statically linked where possible
- Cross-platform Linux support (primary focus: Linux kernel interfaces)
Data Sources
All system information must be read directly from:
/procfilesystem (process information, CPU stats, memory)/sysfilesystem (system-wide metrics)- Standard C library system calls (sysconf, getrlimit, etc.)
/etcsystem files (hostname, OS information)
Display Requirements
Terminal Interface
- Auto-refreshing display (configurable interval, default 1-2 seconds)
- Full-screen terminal rendering using raw terminal control
- Handle terminal resize events gracefully
- Color support for visual differentiation
- UTF-8 character support for borders and separators
Information Categories
System Overview Section
- Hostname and kernel version
- Uptime (days, hours, minutes)
- Current date and time
- Load averages (1, 5, 15 minute)
- System architecture
CPU Information
- Total CPU count and logical cores
- Per-core utilization percentages
- Aggregate CPU usage
- CPU frequency (current, min, max if available)
- CPU temperature (if available from thermal zones)
- Context switches per second
- Interrupts per second
Memory & Swap
- Total physical memory
- Used and available memory
- Memory utilization percentage
- Cached and buffered memory
- Swap total, used, free
- Swap utilization percentage
- Page faults and page in/out statistics
Process Statistics
- Total process count
- Running processes
- Sleeping processes
- Zombie/defunct processes
- Stopped processes
I/O Statistics
- Disk read/write operations per second
- Disk bytes read/written per second
- I/O wait time percentage
- Network statistics (if available): bytes in/out, packets
Process Table
- Scrollable list of running processes (or top N processes)
- Per-process information:
- Process ID (PID)
- Parent PID (PPID)
- User (UID or username)
- CPU usage percentage
- Memory usage percentage and absolute (RSS)
- Virtual memory size (VSZ)
- Process state (running, sleeping, zombie, etc.)
- Command name and arguments (or executable path)
- Thread count
- Priority/Nice value
Network Information
- Interface names and states
- IP addresses (IPv4)
- RX/TX bytes and packets
- Network errors and dropped packets
Filesystem Statistics
- Mount points and filesystems
- Total, used, available space per mount
- Utilization percentage
- Filesystem type
Interface Layout
Header Section
Display system overview with high-level metrics in a compact, scannable format.
Metrics Panels
Organize information into logical sections:
- CPU and thermal metrics
- Memory and swap usage
- Process counts and states
- Network and I/O throughput
- Filesystem usage
Process List
Table format showing top processes by CPU or memory usage, with sortable columns and clear visual hierarchy.
Footer
Display refresh rate, current timestamp, and interaction hints (if applicable).
Rendering Approach
Terminal Control
- Use standard ANSI escape codes for cursor positioning, colors, and formatting
- Implement double-buffering to prevent flicker
- Clear and redraw entire screen on each refresh cycle
- Handle terminal capabilities detection
Performance Considerations
- Minimize system calls per refresh cycle
- Cache system information that doesn't change frequently
- Read
/procefficiently (sequential parsing) - Update only changed values in display
- Target <5% CPU usage for the monitor itself
Color Scheme
- Define a readable color palette using standard terminal colors (16-color or 256-color)
- Use colors to highlight:
- High utilization (red threshold)
- Medium utilization (yellow threshold)
- Normal ranges (green)
- Neutral information (white/default)
Configuration & Behavior
Default Behavior
- Refresh interval: 1-2 seconds (user-adjustable via command-line argument or config)
- Start with full system view
- Sort processes by CPU usage by default (or memory alternative)
- Display processes in descending utilization order
Graceful Shutdown
- Clean terminal state on exit (restore cursor visibility, reset colors)
- Handle SIGINT (Ctrl+C) for clean termination
- Restore terminal to pre-execution state
Edge Cases
- Handle systems with unusual core counts (single-core, high-core systems)
- Support systems with limited
/procfilesystem features - Gracefully degrade missing data sources
- Handle rapid terminal resizing without crashing
Data Update Strategy
Sampling Approach
- Read all system metrics at regular intervals (matching refresh rate)
- Calculate deltas for rate-based metrics (I/O operations, network traffic)
- Maintain rolling history for trend calculation if needed
Metric Calculation
- CPU usage: derived from
/proc/stat(user, system, idle times) - Memory: from
/proc/meminfo - Process metrics: from
/proc/[pid]/stat,/proc/[pid]/status - I/O: from
/proc/diskstatsand/proc/net/dev
Compilation & Deployment
Build Requirements
- Standard C compiler (gcc, clang)
- Produces single static binary (or minimal dynamic linking)
- No configuration files required at runtime
- No installation script needed
Binary Size & Performance
- Target executable size: <2MB
- Startup time: <100ms
- Refresh cycle: <100ms per iteration
- Memory footprint: <10MB RSS during operation
Documentation
The tool should be self-documenting through:
- Clear, logical screen layout
- Labeled sections and columns
- Metric units displayed inline
- Help text on startup or in footer
Success Criteria
- Displays 20+ distinct system metrics simultaneously
- Updates smoothly at regular intervals
- Survives 1+ hour continuous operation without memory leaks
- Responsive to terminal size changes
- No dependencies beyond libc
- Compiles cleanly with
-Wall -Wextra -std=c99 - Provides useful system overview at a glance comparable to htop