#include
#include "sys/config.h"
SYS_NAMESPACE_BEGIN
/***
* 用來擷取系統、核心和程序的各類實時資訊,如CPU和記憶體資料
*/
class CInfo
{
public:
/***
* 系統目前實時資訊
*/
typedef struct
{
long uptime_second; /* Seconds since boot */
unsigned long average_load[3]; /* 1, 5, and 15 minute load averages */
unsigned long ram_total; /* Total usable main memory size */
unsigned long ram_free; /* Available memory size */
unsigned long ram_shared; /* Amount of shared memory */
unsigned long ram_buffer; /* Memory used by buffers */
unsigned long swap_total; /* Total swap space size */
unsigned long swap_free; /* swap space still available */
unsigned short process_number; /* Number of current processes */
}sys_info_t;
* 目前程序時間資訊
long user_time; /* user time */
long system_time; /* system time */
long user_time_children; /* user time of children */
long system_time_children; /* system time of children */
}process_time_t;
* 目前系統CPU資訊
// 機關: jiffies, 1jiffies=0.01秒
uint64_t total;
uint32_t user; /** 從系統啟動開始累計到目前時刻,處于使用者态的運作時間,不包含 nice值為負程序 */
uint32_t nice; /** 從系統啟動開始累計到目前時刻,nice值為負的程序所占用的CPU時間 */
uint32_t system; /** 從系統啟動開始累計到目前時刻,處于核心态的運作時間 */
uint32_t idle; /** 從系統啟動開始累計到目前時刻,除IO等待時間以外的其它等待時間 */
uint32_t iowait; /** 從系統啟動開始累計到目前時刻,IO等待時間(2.5.41) */
uint32_t irq; /** 從系統啟動開始累計到目前時刻,硬中斷時間(2.6.0) */
uint32_t softirq; /** 從系統啟動開始累計到目前時刻,軟中斷時間(2.6.0) */
//uint32_t stealstolen; /** which is the time spent in other operating systems when running in a virtualized environment(2.6.11) */
//uint32_t guest; /** which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(2.6.24) */
}cpu_info_t;
* 目前系統記憶體資訊
uint32_t mem_total;
uint32_t mem_free;
uint32_t buffers;
uint32_t cached;
uint32_t swap_cached;
uint32_t swap_total;
uint32_t swap_free;
}mem_info_t;
* 核心版本号
int16_t major; /** 主版本号 */
int16_t minor; /** 次版本号(如果次版本号是偶數,那麼核心是穩定版;若是奇數則是開發版) */
int16_t revision; /** 修訂版本号 */
}kernel_version_t;
* 當時程序狀态資訊
*
* 程序的狀态值:
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
/** 01 */ pid_t pid; /** 程序号,其允許的最大值,請檢視/proc/sys/kernel/pid_max */
/** 02 */ char comm[FILENAME_MAX]; /** 程序的名字,不包括路徑 */
/** 03 */ char state; /** 程序的狀态 */
/** 04 */ pid_t ppid; /** 父程序号 */
/** 05 */ pid_t pgrp; /** 程序組号 */
/** 06 */ pid_t session; /** 程序會話号 */
/** 07 */ int tty_nr; /** The tty the process uses */
/** 08 */ pid_t tpgid; /** The tty the process uses */
/** 09 */ unsigned int flags; /** The kernel flags word of the process (%lu before Linux 2.6.22) */
/** 10 */ unsigned long minflt; /** The number of minor faults the process has made which have not required loading a memory page from disk */
/** 11 */ unsigned long cminflt; /** The number of minor faults that the process's waited-for children have made */
/** 12 */ unsigned long majflt; /** The number of major faults the process has made which have required loading a memory page from disk */
/** 13 */ unsigned long cmajflt; /** The number of major faults that the process's waited-for children have made */
/** 14 */ unsigned long utime; /** The number of jiffies that this process has been scheduled in user mode */
/** 15 */ unsigned long stime; /** The number of jiffies that this process has been scheduled in kernel mode */
/** 16 */ long cutime; /** The number of jiffies that this process's waited-for children have been scheduled in user mode */
/** 17 */ long cstime; /** The number of jiffies that this process's waited-for children have been scheduled in kernel mode */
/** 18 */ long priority; /** The standard nice value, plus fifteen. The value is never negative in the kernel */
/** 19 */ long nice; /** The nice value ranges from 19 (nicest) to -19 (not nice to others) */
/** 20 */ long num_threads; /** Number of threads in this process (since Linux 2.6). Before kernel 2.6, this field was hard coded to 0 as a placeholder */
/** 21 */ long itrealvalue; /** The time in jiffies before the next SIGALRM is sent to the process due to an interval timer.2.6.17, this field is no longer maintained, and is hard coded as 0 */
/** 22 */ long long starttime; /** The time in jiffies the process started after system boot */
/** 23 */ unsigned long vsize; /** Virtual memory size in bytes */
/** 24 */ long rss; /** Resident Set Size: number of pages the process has in real memory, minus 3 for administrative purposes */
/** 25 */ unsigned long rlim; /** Current limit in bytes on the rss of the process (usually 4294967295 on i386) */
/** 26 */ unsigned long startcode; /** The address above which program text can run */
/** 27 */ unsigned long endcode; /** The address below which program text can run */
/** 28 */ unsigned long startstack; /** The address of the start of the stack */
/** 29 */ unsigned long kstkesp; /** The current value of esp (stack pointer), as found in the kernel stack page for the process */
/** 30 */ unsigned long kstkeip; /** The current EIP (instruction pointer) */
/** 31 */ unsigned long signal; /** The bitmap of pending signals */
/** 32 */ unsigned long blocked; /** The bitmap of blocked signals */
/** 33 */ unsigned long sigignore; /** The bitmap of ignored signals */
/** 34 */ unsigned long sigcatch; /** The bitmap of caught signals */
/** 35 */ unsigned long nswap; /** Number of pages swapped (not maintained). */
/** 36 */ unsigned long cnswap; /** Cumulative nswap for child processes (not maintained) */
/** 37 */ int exit_signal; /** Signal to be sent to parent when we die (since Linux 2.1.22) */
/** 38 */ int processor; /** CPU number last executed on (since Linux 2.2.8) */
}process_info_t;
* 網卡流量資料結構
/** 01 */ char interface_name[INTERFACE_NAME_MAX]; /** 網卡名,如eth0 */
/** 接收資料 */
/** 02 */ unsigned long receive_bytes; /** 此網卡接收到的位元組數 */
/** 03 */ unsigned long receive_packets;
/** 04 */ unsigned long receive_errors;
/** 05 */ unsigned long receive_dropped;
/** 06 */ unsigned long receive_fifo_errors;
/** 07 */ unsigned long receive_frame;
/** 08 */ unsigned long receive_compressed;
/** 09 */ unsigned long receive_multicast;
/** 發送資料 */
/** 10 */ unsigned long transmit_bytes; /** 此網卡已發送的位元組數 */
/** 11 */ unsigned long transmit_packets;
/** 12 */ unsigned long transmit_errors;
/** 13 */ unsigned long transmit_dropped;
/** 14 */ unsigned long transmit_fifo_errors;
/** 15 */ unsigned long transmit_collisions;
/** 16 */ unsigned long transmit_carrier;
/** 17 */ unsigned long transmit_compressed;
}net_info_t;
* 程序頁資訊結構
long size; /** 程式大小 */
long resident; /** 常駐記憶體空間大小 */
long share; /** 共享記憶體頁數 */
long text; /** 代碼段占用記憶體頁數 */
long lib; /** 資料/堆棧段占用記憶體頁數 */
long data; /** 引用庫占用記憶體頁數 */
}process_page_info_t;
/** 擷取系統資訊,具體請參考sys_info_t的描述 */
static bool get_sys_info(sys_info_t& sys_info);
/** 擷取記憶體資訊,具體請參考mem_info_t的描述 */
static bool get_mem_info(mem_info_t& mem_info);
/** 擷取總CPU資訊,具體請參考cpu_info_t的描述 */
static bool get_cpu_info(cpu_info_t& cpu_info);
/** 擷取所有CPU資訊,具體請參考cpu_info_t的描述 */
static int get_cpu_info_array(std::vector& cpu_info_array);
/** 得到核心版本号 */
static bool get_kernel_version(kernel_version_t& kernel_version);
/** 擷取程序資訊,具體請參考process_info_t的描述 */
static bool get_process_info(process_info_t& process_info);
/** 擷取程序頁資訊,具體請參考process_page_info_t的描述 */
static bool get_process_page_info(process_page_info_t& process_page_info);
/** 擷取程序運作時間資料,具體請參考process_time_t的描述 */
static bool get_process_times(process_time_t& process_time);
* 擷取網卡流量等資訊
* 流量 = (目前擷取的值 - 上一時間擷取的值) / 兩次間隔的時長
* @interface_name: 網卡名,如eth0等
* @net_info: 存儲網卡流量等資料
static bool get_net_info(const char* interface_name, net_info_t& net_info);
static bool get_net_info_array(std::vector& net_info_array);
private:
static bool do_get_net_info_array(const char* interface_name, std::vector& net_info_array);
};
SYS_NAMESPACE_END