2 * pidstat: Display per-process statistics.
3 * (C) 2007-2021 by Sebastien Godard (sysstat <at> orange.fr)
8 #ifdef HAVE_SYS_PARAM_H
10 /* sys/param.h defines HZ but needed for _POSIX_ARG_MAX and LOGIN_NAME_MAX */
17 #define K_P_TASK "TASK"
18 #define K_P_CHILD "CHILD"
22 #define MAX_COMM_LEN _POSIX_ARG_MAX
23 #define MAX_CMDLINE_LEN _POSIX_ARG_MAX
25 #define MAX_COMM_LEN 128
26 #define MAX_CMDLINE_LEN 128
30 #define MAX_USER_LEN LOGIN_NAME_MAX
32 #define MAX_USER_LEN 32
39 #define P_A_CTXSW 0x08
40 #define P_A_STACK 0x10
44 #define DISPLAY_CPU(m) (((m) & P_A_CPU) == P_A_CPU)
45 #define DISPLAY_MEM(m) (((m) & P_A_MEM) == P_A_MEM)
46 #define DISPLAY_IO(m) (((m) & P_A_IO) == P_A_IO)
47 #define DISPLAY_CTXSW(m) (((m) & P_A_CTXSW) == P_A_CTXSW)
48 #define DISPLAY_STACK(m) (((m) & P_A_STACK) == P_A_STACK)
49 #define DISPLAY_KTAB(m) (((m) & P_A_KTAB) == P_A_KTAB)
50 #define DISPLAY_RT(m) (((m) & P_A_RT) == P_A_RT)
57 #define DISPLAY_TASK_STATS(m) (((m) & P_TASK) == P_TASK)
58 #define DISPLAY_CHILD_STATS(m) (((m) & P_CHILD) == P_CHILD)
60 #define P_D_PID 0x0001
61 #define P_D_ALL_PID 0x0002
62 #define P_F_IRIX_MODE 0x0004
63 #define P_F_COMMSTR 0x0008
64 #define P_D_ACTIVE_PID 0x0010
65 #define P_D_TID 0x0020
66 #define P_D_ONELINE 0x0040
67 #define P_D_CMDLINE 0x0080
68 #define P_D_USERNAME 0x0100
69 #define P_F_USERSTR 0x0200
70 #define P_F_PROCSTR 0x0400
71 #define P_D_UNIT 0x0800
72 #define P_D_SEC_EPOCH 0x1000
73 #define P_F_EXEC_PGM 0x2000
75 #define DISPLAY_PID(m) (((m) & P_D_PID) == P_D_PID)
76 #define DISPLAY_ALL_PID(m) (((m) & P_D_ALL_PID) == P_D_ALL_PID)
77 #define IRIX_MODE_OFF(m) (((m) & P_F_IRIX_MODE) == P_F_IRIX_MODE)
78 #define COMMAND_STRING(m) (((m) & P_F_COMMSTR) == P_F_COMMSTR)
79 #define DISPLAY_ACTIVE_PID(m) (((m) & P_D_ACTIVE_PID) == P_D_ACTIVE_PID)
80 #define DISPLAY_TID(m) (((m) & P_D_TID) == P_D_TID)
81 #define DISPLAY_ONELINE(m) (((m) & P_D_ONELINE) == P_D_ONELINE)
82 #define DISPLAY_CMDLINE(m) (((m) & P_D_CMDLINE) == P_D_CMDLINE)
83 #define DISPLAY_USERNAME(m) (((m) & P_D_USERNAME) == P_D_USERNAME)
84 #define USER_STRING(m) (((m) & P_F_USERSTR) == P_F_USERSTR)
85 #define PROCESS_STRING(m) (((m) & P_F_PROCSTR) == P_F_PROCSTR)
86 #define DISPLAY_UNIT(m) (((m) & P_D_UNIT) == P_D_UNIT)
87 #define PRINT_SEC_EPOCH(m) (((m) & P_D_SEC_EPOCH) == P_D_SEC_EPOCH)
88 #define EXEC_PGM(m) (((m) & P_F_EXEC_PGM) == P_F_EXEC_PGM)
90 /* Per-process flags */
91 #define F_NO_PID_IO 0x01
92 #define F_NO_PID_FD 0x02
93 #define F_PID_DISPLAYED 0x04
95 #define NO_PID_IO(m) (((m) & F_NO_PID_IO) == F_NO_PID_IO)
96 #define NO_PID_FD(m) (((m) & F_NO_PID_FD) == F_NO_PID_FD)
97 #define IS_PID_DISPLAYED(m) (((m) & F_PID_DISPLAYED) == F_PID_DISPLAYED)
100 #define PROC PRE "/proc"
102 #define PID_STAT PRE "/proc/%u/stat"
103 #define PID_STATUS PRE "/proc/%u/status"
104 #define PID_IO PRE "/proc/%u/io"
105 #define PID_CMDLINE PRE "/proc/%u/cmdline"
106 #define PID_SMAP PRE "/proc/%u/smaps"
107 #define PID_FD PRE "/proc/%u/fd"
108 #define PID_SCHED PRE "/proc/%u/schedstat"
110 #define PROC_TASK PRE "/proc/%u/task"
111 #define TASK_STAT PRE "/proc/%u/task/%u/stat"
112 #define TASK_SCHED PRE "/proc/%u/task/%u/schedstat"
113 #define TASK_STATUS PRE "/proc/%u/task/%u/status"
114 #define TASK_IO PRE "/proc/%u/task/%u/io"
115 #define TASK_CMDLINE PRE "/proc/%u/task/%u/cmdline"
116 #define TASK_SMAP PRE "/proc/%u/task/%u/smaps"
117 #define TASK_FD PRE "/proc/%u/task/%u/fd"
119 #define PRINT_ID_HDR(_timestamp_, _flag_) do { \
120 printf("\n%-11s", _timestamp_); \
121 if (DISPLAY_USERNAME(_flag_)) { \
127 if (DISPLAY_TID(_flag_)) { \
128 printf(" TGID TID"); \
135 /* Normally defined in <linux/sched.h> */
137 #define SCHED_NORMAL 0
146 #define SCHED_BATCH 3
148 /* SCHED_ISO not yet implemented */
152 #ifndef SCHED_DEADLINE
153 #define SCHED_DEADLINE 6
156 #define GET_POLICY(p) \
157 (p == SCHED_NORMAL ? "NORMAL" : \
158 (p == SCHED_FIFO ? "FIFO" : \
159 (p == SCHED_RR ? "RR" : \
160 (p == SCHED_BATCH ? "BATCH" : \
161 (p == SCHED_IDLE ? "IDLE" : \
162 (p == SCHED_DEADLINE ? "DEADLN" : \
166 unsigned long long read_bytes __attribute__ ((aligned (8)));
167 unsigned long long write_bytes __attribute__ ((packed));
168 unsigned long long cancelled_write_bytes __attribute__ ((packed));
169 unsigned long long blkio_swapin_delays __attribute__ ((packed));
170 unsigned long long minflt __attribute__ ((packed));
171 unsigned long long cminflt __attribute__ ((packed));
172 unsigned long long majflt __attribute__ ((packed));
173 unsigned long long cmajflt __attribute__ ((packed));
174 unsigned long long utime __attribute__ ((packed));
175 long long cutime __attribute__ ((packed));
176 unsigned long long stime __attribute__ ((packed));
177 long long cstime __attribute__ ((packed));
178 unsigned long long gtime __attribute__ ((packed));
179 long long cgtime __attribute__ ((packed));
180 unsigned long long wtime __attribute__ ((packed));
181 unsigned long long vsz __attribute__ ((packed));
182 unsigned long long rss __attribute__ ((packed));
183 unsigned long nvcsw __attribute__ ((packed));
184 unsigned long nivcsw __attribute__ ((packed));
185 unsigned long stack_size __attribute__ ((packed));
186 unsigned long stack_ref __attribute__ ((packed));
187 unsigned int processor __attribute__ ((packed));
188 unsigned int priority __attribute__ ((packed));
189 unsigned int policy __attribute__ ((packed));
190 unsigned int threads __attribute__ ((packed));
191 unsigned int fd_nr __attribute__ ((packed));
194 #define PID_STATS_SIZE (sizeof(struct pid_stats))
197 unsigned long long total_vsz;
198 unsigned long long total_rss;
199 unsigned long long total_stack_size;
200 unsigned long long total_stack_ref;
201 unsigned long long total_threads;
202 unsigned long long total_fd_nr;
205 int exist; /* TRUE if PID exists */
207 unsigned int rt_asum_count;
208 unsigned int rc_asum_count;
209 unsigned int uc_asum_count;
210 unsigned int tf_asum_count;
211 unsigned int sk_asum_count;
212 unsigned int delay_asum_count;
213 struct pid_stats *pstats[3];
214 struct st_pid *tgid; /* If current task is a TID, pointer to its TGID. NULL otherwise. */
216 char comm[MAX_COMM_LEN];
217 char cmdline[MAX_CMDLINE_LEN];
220 #endif /* _PIDSTAT_H */