summaryrefslogtreecommitdiff
path: root/proc/pids.h
blob: 04c957a066e2f23b95554d38fcd5581df4b9f2c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
/*
 * pids.h - process related declarations for libprocps
 *
 * Copyright (C) 1998-2005 Albert Cahalan
 * Copyright (C) 2015 Craig Small <csmall@dropbear.xyz>
 * Copyright (C) 2015-2021 Jim Warner <james.warner@comcast.net>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef PROCPS_PIDS_H
#define PROCPS_PIDS_H

#ifdef __cplusplus
extern "C" {
#endif

enum pids_item {
    PIDS_noop,              //        ( never altered )
    PIDS_extra,             //        ( reset to zero )
                            //  returns        origin, see proc(5)
                            //  -------        -------------------
    PIDS_ADDR_END_CODE,     //   ul_int        stat: endcode
    PIDS_ADDR_KSTK_EIP,     //   ul_int        stat: kstkeip
    PIDS_ADDR_KSTK_ESP,     //   ul_int        stat: kstkesp
    PIDS_ADDR_START_CODE,   //   ul_int        stat: startcode
    PIDS_ADDR_START_STACK,  //   ul_int        stat: statstack
    PIDS_CGNAME,            //      str      [ derived from CGROUP ':name=' ]
    PIDS_CGROUP,            //      str        cgroup
    PIDS_CGROUP_V,          //     strv        cgroup, as *str[]
    PIDS_CMD,               //      str        stat: comm or status: Name
    PIDS_CMDLINE,           //      str        cmdline
    PIDS_CMDLINE_V,         //     strv        cmdline, as *str[]
    PIDS_ENVIRON,           //      str        environ
    PIDS_ENVIRON_V,         //     strv        environ, as *str[]
    PIDS_EXE,               //      str        exe
    PIDS_EXIT_SIGNAL,       //    s_int        stat: exit_signal
    PIDS_FLAGS,             //   ul_int        stat: flags
    PIDS_FLT_MAJ,           //   ul_int        stat: majflt
    PIDS_FLT_MAJ_C,         //   ul_int        stat: majflt + cmajflt
    PIDS_FLT_MAJ_DELTA,     //    s_int      [ derived from FLT_MAJ ]
    PIDS_FLT_MIN,           //   ul_int        stat: minflt
    PIDS_FLT_MIN_C,         //   ul_int        stat: minflt + cminflt
    PIDS_FLT_MIN_DELTA,     //    s_int      [ derived from FLT_MIN ]
    PIDS_ID_EGID,           //    u_int        status: Uid
    PIDS_ID_EGROUP,         //      str      [ derived from EGID, see getgrgid(3) ]
    PIDS_ID_EUID,           //    u_int        status: Uid
    PIDS_ID_EUSER,          //      str      [ derived from EUID, see getpwuid(3) ]
    PIDS_ID_FGID,           //    u_int        status: Uid
    PIDS_ID_FGROUP,         //      str      [ derived from FGID, see getgrgid(3) ]
    PIDS_ID_FUID,           //    u_int        status: Uid
    PIDS_ID_FUSER,          //      str      [ derived from FUID, see getpwuid(3) ]
    PIDS_ID_LOGIN,          //    s_int        loginuid
    PIDS_ID_PGRP,           //    s_int        stat: pgrp
    PIDS_ID_PID,            //    s_int        from /proc/<pid>
    PIDS_ID_PPID,           //    s_int        stat: ppid or status: PPid
    PIDS_ID_RGID,           //    u_int        status: Gid
    PIDS_ID_RGROUP,         //      str      [ derived from RGID, see getgrgid(3) ]
    PIDS_ID_RUID,           //    u_int        status: Gid
    PIDS_ID_RUSER,          //      str      [ derived from RUID, see getpwuid(3) ]
    PIDS_ID_SESSION,        //    s_int        stat: session
    PIDS_ID_SGID,           //    u_int        status: Gid
    PIDS_ID_SGROUP,         //      str      [ derived from SGID, see getgrgid(3) ]
    PIDS_ID_SUID,           //    u_int        status: Gid
    PIDS_ID_SUSER,          //      str      [ derived from SUID, see getpwuid(3) ]
    PIDS_ID_TGID,           //    s_int        status: Tgid
    PIDS_ID_TID,            //    s_int        from /proc/<pid>/task/<tid>
    PIDS_ID_TPGID,          //    s_int        stat: tpgid
    PIDS_LXCNAME,           //      str      [ derived from CGROUP 'lxc.payload' ]
    PIDS_MEM_CODE,          //   ul_int      [ derived from MEM_CODE_PGS, as KiB ]
    PIDS_MEM_CODE_PGS,      //   ul_int        statm: text
    PIDS_MEM_DATA,          //   ul_int      [ derived from MEM_DATA_PGS, as KiB ]
    PIDS_MEM_DATA_PGS,      //   ul_int        statm: data
    PIDS_MEM_RES,           //   ul_int      [ derived from MEM_RES_PGS, as KiB ]
    PIDS_MEM_RES_PGS,       //   ul_int        statm: resident
    PIDS_MEM_SHR,           //   ul_int      [ derived from MEM_SHR_PGS, as KiB ]
    PIDS_MEM_SHR_PGS,       //   ul_int        statm: shared
    PIDS_MEM_VIRT,          //   ul_int      [ derived from MEM_VIRT_PGS, as KiB ]
    PIDS_MEM_VIRT_PGS,      //   ul_int        statm: size
    PIDS_NICE,              //    s_int        stat: nice
    PIDS_NLWP,              //    s_int        stat: num_threads or status: Threads
    PIDS_NS_IPC,            //   ul_int        ns/
    PIDS_NS_MNT,            //   ul_int         "
    PIDS_NS_NET,            //   ul_int         "
    PIDS_NS_PID,            //   ul_int         "
    PIDS_NS_USER,           //   ul_int         "
    PIDS_NS_UTS,            //   ul_int         "
    PIDS_OOM_ADJ,           //    s_int        oom_score_adj
    PIDS_OOM_SCORE,         //    s_int        oom_score
    PIDS_PRIORITY,          //    s_int        stat: priority
    PIDS_PRIORITY_RT,       //    s_int        stat: rt_priority
    PIDS_PROCESSOR,         //    u_int        stat: processor
    PIDS_PROCESSOR_NODE,    //    s_int      [ derived from PROCESSOR, see numa(3) ]
    PIDS_RSS,               //   ul_int        stat: rss
    PIDS_RSS_RLIM,          //   ul_int        stat: rsslim
    PIDS_SCHED_CLASS,       //    s_int        stat: policy
    PIDS_SD_MACH,           //      str      [ derived from PID/TID, see sd-login(3) ]
    PIDS_SD_OUID,           //      str         "
    PIDS_SD_SEAT,           //      str         "
    PIDS_SD_SESS,           //      str         "
    PIDS_SD_SLICE,          //      str         "
    PIDS_SD_UNIT,           //      str         "
    PIDS_SD_UUNIT,          //      str         "
    PIDS_SIGBLOCKED,        //      str        status: SigBlk
    PIDS_SIGCATCH,          //      str        status: SigCgt
    PIDS_SIGIGNORE,         //      str        status: SigIgn
    PIDS_SIGNALS,           //      str        status: ShdPnd
    PIDS_SIGPENDING,        //      str        status: SigPnd
    PIDS_STATE,             //     s_ch        stat: state or status: State
    PIDS_SUPGIDS,           //      str        status: Groups
    PIDS_SUPGROUPS,         //      str      [ derived from SUPGIDS, see getgrgid(3) ]
    PIDS_TICS_ALL,          //  ull_int        stat: stime + utime
    PIDS_TICS_ALL_C,        //  ull_int        stat: stime + utime + cstime + cutime
    PIDS_TICS_ALL_DELTA,    //    s_int      [ derived from TICS_ALL ]
    PIDS_TICS_BLKIO,        //  ull_int        stat: delayacct_blkio_ticks
    PIDS_TICS_GUEST,        //  ull_int        stat: guest_time
    PIDS_TICS_GUEST_C,      //  ull_int        stat: guest_time + cguest_time
    PIDS_TICS_SYSTEM,       //  ull_int        stat: stime
    PIDS_TICS_SYSTEM_C,     //  ull_int        stat: stime + cstime
    PIDS_TICS_USER,         //  ull_int        stat: utime
    PIDS_TICS_USER_C,       //  ull_int        stat: utime + cutime
    PIDS_TIME_ALL,          //  ull_int      [ derived from (utime + stime) / hertz ]
    PIDS_TIME_ELAPSED,      //  ull_int      [ derived from /proc/uptime - (starttime / hertz) ]
    PIDS_TIME_START,        //  ull_int        stat: starttime
    PIDS_TTY,               //    s_int        stat: tty_nr
    PIDS_TTY_NAME,          //      str      [ derived from TTY ]
    PIDS_TTY_NUMBER,        //      str      [ derived from TTY as str ]
    PIDS_VM_DATA,           //   ul_int        status: VmData
    PIDS_VM_EXE,            //   ul_int        status: VmExe
    PIDS_VM_LIB,            //   ul_int        status: VmLib
    PIDS_VM_RSS,            //   ul_int        status: VmRSS
    PIDS_VM_RSS_ANON,       //   ul_int        status: RssAnon
    PIDS_VM_RSS_FILE,       //   ul_int        status: RssFile
    PIDS_VM_RSS_LOCKED,     //   ul_int        status: VmLck
    PIDS_VM_RSS_SHARED,     //   ul_int        status: RssShmem
    PIDS_VM_SIZE,           //   ul_int        status: VmSize
    PIDS_VM_STACK,          //   ul_int        status: VmStk
    PIDS_VM_SWAP,           //   ul_int        status: VmSwap
    PIDS_VM_USED,           //   ul_int        status: VmRSS + VmSwap
    PIDS_VSIZE_PGS,         //   ul_int        stat: vsize
    PIDS_WCHAN_NAME         //      str        wchan
};

enum pids_fetch_type {
    PIDS_FETCH_TASKS_ONLY,
    PIDS_FETCH_THREADS_TOO
};

enum pids_select_type {
    PIDS_SELECT_PID  = 0x1000,
    PIDS_SELECT_UID  = 0x4000
};

enum pids_sort_order {
    PIDS_SORT_ASCEND   = +1,
    PIDS_SORT_DESCEND  = -1
};


struct pids_result {
    enum pids_item item;
    union {
        signed char         s_ch;
        signed int          s_int;
        unsigned int        u_int;
        unsigned long       ul_int;
        unsigned long long  ull_int;
        char               *str;
        char              **strv;
    } result;
};

struct pids_stack {
    struct pids_result *head;
};

struct pids_counts {
    int total;
    int running, sleeping, stopped, zombied, other;
};

struct pids_fetch {
    struct pids_counts *counts;
    struct pids_stack **stacks;
};


#define PIDS_VAL( relative_enum, type, stack, info ) \
    stack -> head [ relative_enum ] . result . type


struct pids_info;

int procps_pids_new   (struct pids_info **info, enum pids_item *items, int numitems);
int procps_pids_ref   (struct pids_info  *info);
int procps_pids_unref (struct pids_info **info);

struct pids_stack *fatal_proc_unmounted (
    struct pids_info *info,
    int return_self);

struct pids_stack *procps_pids_get (
    struct pids_info *info,
    enum pids_fetch_type which);

struct pids_fetch *procps_pids_reap (
    struct pids_info *info,
    enum pids_fetch_type which);

int procps_pids_reset (
    struct pids_info *info,
    enum pids_item *newitems,
    int newnumitems);

struct pids_fetch *procps_pids_select (
    struct pids_info *info,
    unsigned *these,
    int numthese,
    enum pids_select_type which);

struct pids_stack **procps_pids_sort (
    struct pids_info *info,
    struct pids_stack *stacks[],
    int numstacked,
    enum pids_item sortitem,
    enum pids_sort_order order);


#ifdef XTRA_PROCPS_DEBUG
# include "xtra-procps-debug.h"
#endif
#ifdef __cplusplus
}
#endif
#endif