]> granicus.if.org Git - sysstat/blob - pidstat.h
Use sizeof() instead of hard-coded values with snprintf() function
[sysstat] / pidstat.h
1 /*
2  * pidstat: Display per-process statistics.
3  * (C) 2007-2021 by Sebastien Godard (sysstat <at> orange.fr)
4  */
5 #ifndef _PIDSTAT_H
6 #define _PIDSTAT_H
7
8 #ifdef HAVE_SYS_PARAM_H
9 #include <sys/param.h>
10 /* sys/param.h defines HZ but needed for _POSIX_ARG_MAX and LOGIN_NAME_MAX */
11 #undef HZ
12 #endif
13 #include "common.h"
14
15 #define K_SELF          "SELF"
16
17 #define K_P_TASK        "TASK"
18 #define K_P_CHILD       "CHILD"
19 #define K_P_ALL         "ALL"
20
21 #ifdef _POSIX_ARG_MAX
22 #define MAX_COMM_LEN    _POSIX_ARG_MAX
23 #define MAX_CMDLINE_LEN _POSIX_ARG_MAX
24 #else
25 #define MAX_COMM_LEN    128
26 #define MAX_CMDLINE_LEN 128
27 #endif
28
29 #ifdef LOGIN_NAME_MAX
30 #define MAX_USER_LEN    LOGIN_NAME_MAX
31 #else
32 #define MAX_USER_LEN    32
33 #endif
34
35 /* Activities */
36 #define P_A_CPU         0x01
37 #define P_A_MEM         0x02
38 #define P_A_IO          0x04
39 #define P_A_CTXSW       0x08
40 #define P_A_STACK       0x10
41 #define P_A_KTAB        0x20
42 #define P_A_RT          0x40
43
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)
51
52 /* TASK/CHILD */
53 #define P_NULL          0x00
54 #define P_TASK          0x01
55 #define P_CHILD         0x02
56
57 #define DISPLAY_TASK_STATS(m)   (((m) & P_TASK) == P_TASK)
58 #define DISPLAY_CHILD_STATS(m)  (((m) & P_CHILD) == P_CHILD)
59
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
74
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)
89
90 /* Per-process flags */
91 #define F_NO_PID_IO     0x01
92 #define F_NO_PID_FD     0x02
93 #define F_PID_DISPLAYED 0x04
94
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)
98
99
100 #define PROC            PRE "/proc"
101
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"
109
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"
118
119 #define PRINT_ID_HDR(_timestamp_, _flag_)       do {                                            \
120                                                         printf("\n%-11s", _timestamp_); \
121                                                         if (DISPLAY_USERNAME(_flag_)) {         \
122                                                                 printf("     USER");            \
123                                                         }                                       \
124                                                         else {                                  \
125                                                                 printf("   UID");               \
126                                                         }                                       \
127                                                         if (DISPLAY_TID(_flag_)) {              \
128                                                                 printf("      TGID       TID"); \
129                                                         }                                       \
130                                                         else {                                  \
131                                                                 printf("       PID");           \
132                                                         }                                       \
133                                                 } while (0)
134
135 /* Normally defined in <linux/sched.h> */
136 #ifndef SCHED_NORMAL
137 #define SCHED_NORMAL    0
138 #endif
139 #ifndef SCHED_FIFO
140 #define SCHED_FIFO      1
141 #endif
142 #ifndef SCHED_RR
143 #define SCHED_RR        2
144 #endif
145 #ifndef SCHED_BATCH
146 #define SCHED_BATCH     3
147 #endif
148 /* SCHED_ISO not yet implemented */
149 #ifndef SCHED_IDLE
150 #define SCHED_IDLE      5
151 #endif
152 #ifndef SCHED_DEADLINE
153 #define SCHED_DEADLINE  6
154 #endif
155
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" : \
163         "?"))))))
164
165 struct pid_stats {
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));
192 };
193
194 #define PID_STATS_SIZE  (sizeof(struct pid_stats))
195
196 struct st_pid {
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;
203         pid_t              pid;
204         uid_t              uid;
205         int                exist;       /* TRUE if PID exists */
206         unsigned int       flags;
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. */
215         struct st_pid     *next;
216         char               comm[MAX_COMM_LEN];
217         char               cmdline[MAX_CMDLINE_LEN];
218 };
219
220 #endif  /* _PIDSTAT_H */