|
# 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:
|
|
- `/proc` filesystem (process information, CPU stats, memory)
|
|
- `/sys` filesystem (system-wide metrics)
|
|
- Standard C library system calls (sysconf, getrlimit, etc.)
|
|
- `/etc` system 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 `/proc` efficiently (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 `/proc` filesystem 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/diskstats` and `/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
|