File: Process.h

package info (click to toggle)
procdump 3.4.1-1~exp4
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 15,276 kB
  • sloc: ansic: 202,443; cpp: 51,275; sh: 1,618; cs: 76; makefile: 12
file content (300 lines) | stat: -rw-r--r-- 12,204 bytes parent folder | download
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License

//--------------------------------------------------------------------
//
// This library reads from the /procfs pseudo filesystem
//
//--------------------------------------------------------------------

#ifndef PROCFSLIB_PROCESS_H
#define PROCFSLIB_PROCESS_H

#ifdef __linux__
#include <linux/version.h>
#endif

#include <unistd.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define NO_PID INT_MAX
#define MAX_CMDLINE_LEN 4096+1
#define PID_MAX_KERNEL_CONFIG "/proc/sys/kernel/pid_max"

// -----------------------------------------------------------
// a series of structs for containing infromation from /procfs
// -----------------------------------------------------------

//
// /proc/[pid]/stat
//
struct ProcessStat {
    pid_t pid;      // the process ID : %d
    char *comm;     // The filename of the executable : %s
    char state;     // Process State, one of RSDZTtWXxKP : %c
    pid_t ppid;     // the parent process ID : %d
    pid_t pgrp;     // the process group ID of the process : %d
    int session;    // The session ID of the process : %d

    // The controlling terminal of the process.
    // (the minor device number is contained in the combination
    // of bits 31 to 20 and 7 to 0; the major device number is in bits 15 to 8) : %d
    int tty_nr;
    pid_t tpgid; // The ID of the foreground process group of the controlling terminal process : %d

    unsigned int flags;  // Kernel flags word of the process. See PF_* definitions in include/linux/sched.h : %u

    // Number of minor faults the process has made which have not required loading a memory page from disk
    unsigned long minflt;

    // Number of minor faults that the process's waited-for children have made
    unsigned long cminflt;

    // Number of major faults the process has made which have required loading a memory page from disk
    unsigned long majflt;

    // Number of major faults that the process's waited-for children have made
    unsigned long cmajflt;

    // Amount of time that this process has been scheduled in user mode, measured in clock ticks
    unsigned long utime;

    // Amount of time that this process has been scheduled in kernel mode, measured in clock ticks
    unsigned long stime;

    // Amount of time that this process's waited-for children have been scheduled in user mode, measured in clock ticks
    unsigned long cutime;

    // Amount of time that this process's waited-for children have been scheduled in kernel mode, measured in clock ticks
    unsigned long cstime;

    // For processes running under a non-real-time scheduling policy, this is the raw
    // nice value (setpriority(2)) as represented in the kernel. For processes running in a
    // real-time scheduling policy, this is the negated scheduling priority minus one.
    long priority;

    // The nice value, a value in the range 19 (low priority) to -20 (high priority)
    long nice;

    // Number of threads in this process
    long num_threads;

    // The time in jiffies before the next SIGALRM is sent to the process due to an interval timer.
    long itrealvalue;

    // The time the process started after system boot
    unsigned long long starttime;

    // Virtual memory size in bytes
    unsigned long vsize;

    // Resident Set Size: # of pages the process has in _real memory_.
    // This is just the pages which count toward text, data, or stack space.
    // This does not include pages which have not been demand-loaded in,
    // or which are swapped out
    long rss;

    // Current soft limit in bytes on the rss of the process
    unsigned long rsslim;

    //The address above which program text can run
    unsigned long startcode;

    //The address below which program text can run
    unsigned long endcode;

    // The address of the start (i.e., bottom) of the stack
    unsigned long startstack;

    // The current value of the ESP (stack pointer), as found in the kernel stack page for the process
    // NOTE: due to race conditions, this is not reliable, try ptrace
    unsigned long kstkesp;

    // The current EIP (Instruction pointer)
    // NOTE: due to race conditions, this is not reliable, try ptrace
    unsigned long kstkeip;

    // The bitmap of pending signals, displayed as a decimal number.
    // Obsolete, because it does not provide information on real-time signals;
    // for that use /proc/[pid]/status instead.
    unsigned long signal;

    // The bitmap of blocked signals, displayed as a decimal number;
    // Obsolete, because it does not provide information on real-time signals;
    // for that use /proc/[pid]/status instead.
    unsigned long blocked;

    // The bitmap of ignored signals, displayed as a decimal number.
    // Obsolete, because it does not provide information on real-time signals;
    // for that use /proc/[pid]/status instead.
    unsigned long sigignore;

    // The bitmap of caught signals, displayed as a decimal number.
    // Obsolete, because it does not provide information on real-time signals;
    // for that use /proc/[pid]/status instead.
    unsigned long sigcatch;

    // This is the "channel" in which the process is waiting.  It is the
    // address of a location in the kernel where the process is sleeping.
    // The corresponding symbolic name can be found in /proc/[pid]/wchan.
    unsigned long wchan;

    // Number of pages swapped (not maintained).
    unsigned long nswap;

    // Cumulative nswap for child processes (not maintained).
    unsigned long cnswap;

    // signal to be sent to parent when we die. (since Linux 2.1.22)
    int exit_signal;

    // CPU number last executed on (since Linux 2.2.8)
    int processor;

    // Real-time scheduling priority, a number in the range 1 to 99 for
    // processes scheduled under a real-time policy, or 0, for non-real-
    // time processes
    unsigned int rt_priority;

    // Scheduling policy. Decode using the SCHED_* constants in
    // linux/sched.h
    unsigned int policy;

    // Aggregated block I/O delays, measured in clock ticks (centiseconds)
    unsigned long long delayacct_blkio_ticks;

    // Guest time of the process (time spent running a virtual CPU for a
    // guest operating system), measured in clock ticks (divide by
    // sysconf(_SC_CLK_TCK)).
    unsigned long guest_time;

    // Guest time of the the process's children, measure in clock ticks
    // (divide by sysconf(_SC_CLK_TCK)).
    long cguest_time;

    // Address above which program initialized and uninitialized (BSS)
    // data are placed.
    unsigned long start_data;

    // Address below which program initialized and uninitialized (BSS)
    // data are placed.
    unsigned long end_data;

    // Address above which program heap can be expanded with brk.
    unsigned long start_brk;

    // Address above which program command-line arguments (argv) are placed.
    unsigned long arg_start;

    // Address below which program command-lin arguments (argv) are placed.
    unsigned long arg_end;

    // Address above which program environment is placed.
    unsigned long env_start;

    // Address below which program environment is placed.
    unsigned long env_end;

    // The thread'd exit status in the form reported by waitpid.
    int exit_code;

    // NOTE: This does not come from /proc/[pid]/stat rather is populated by enumerating the /proc/<pid>>/fdinfo
    int num_filedescriptors;

    // NOTE: Populated by enumerating the /proc/<pid>>/status
    uid_t real_uid;
    uid_t effective_uid;
    uid_t saved_uid;
    uid_t fs_uid;
};

//
// Struct for /proc/[pid]/status
//
struct ProcessStatus {
    char *Name;             // Command run by this process
    char State;             // Current state of the process. One of RSDTZX
    pid_t Tgid;             // Thread Group ID (i.e., Process ID).
    pid_t Pid;              // Thread ID
    pid_t PPid;             // PID of the parent process
    pid_t TracerPid;        // PID of the processtracing this process (0 if not being traced).
    uid_t Uid[4];           // Real [0], effective [1], saved set [2], and filesystem [3] UIDs
    pid_t Gid[4];           // Real [0], effective [1], saved set [2], and filesystem [3] GIDs
    int FDSize;             // Number of file descriptor slots currently allocated.
    pid_t *Groups;          // Supplementary group list (array).
    int GroupsLen;
    unsigned long VmPeak;   // Peak virtual memory size.
    unsigned long VmSize;   // Virtual memory size.
    unsigned long VmLck;    // Locked virtual memory.
    unsigned long VmPin;    // Pinned memory size (since Linux 3.2).  These are pages that can't be moved because something needs to directly access physical memory.
    unsigned long VmHwM;    // Peak resident size ("High Water Mark").
    unsigned long VmRSS;    // Resident Set Size.
    unsigned long VmData;   // Size of data segment.
    unsigned long VmStk;    // Size of stack segment.
    unsigned long VmExe;    // Size of text segment.
    unsigned long VmLib;    // Shared library code size.
    unsigned long VmPTE;    // Page table entries size (since Linux 2.6.10).
    unsigned long VmPMD;    // Size of second-level page tables (since Linux 4.0).
    unsigned long VmSwap;   // Swapped-out virtual memory size by anonymous private pages; shmem swap usage is not included.
    int Threads;            // Number of threads in process containing this thread.

    // This  field  contains  two  slash-separated  numbers that relate to
    // queued signals for the real user ID of this process.  The first [0]  of  these
    // is the  number of currently queued signals for this real user ID, and the
    // second [1] is the resource limit on the number  of  queued  signals  for  this process
    int SigQ[2];

    unsigned long SigPnd; // Number of signals pending for thread.
    unsigned long ShdPnd; // Number of signals pending for process as a whole.

    unsigned long SigBlk; // Mask indicating signals being blocked.
    unsigned long SigIgn; // Mask indicating signals being ignored.
    unsigned long SigCgt; // Mask indicating signals being caught.

    unsigned long CapInh; // Mask of capabilities enabled in inheritable sets.
    unsigned long CapPrm; // Mask of capabilities enabled in permitted sets.
    unsigned long CapEff; // Mask of capabilities enabled in effective sets.
    unsigned long CapBnd; // Capability Bounding set.
    unsigned long CapAmb; // Ambient capability set (since linux 4.3).

    // Seccomp mode of the process (since Linux 3.8).
    // 0 means  SECCOMP_MODE_DISABLED;
    // 1  means  SECCOMP_MODE_STRICT;
    // 2 means SECCOMP_MODE_FILTER.
    // This field is provided only if  the  kernel  was  built
    // with the CONFIG_SECCOMP kernel configuration option enabled.
    int Seccomp;

    // These fields are subject to the formats laid out in cpuset(7)
    // They will be represented as char* here
    char *Cpus_allowed;        // Mask of CPUs on which this process may run.
    char *Cpus_allowed_list;   // Same as previous, but in "list format".
    char *Mems_allowed;        // Mask of memory nodes allowed to this process.
    char *Mems_allowed_list;   // Same as previous, but in "list format".

    int voluntary_ctxt_switches;       // Number of voluntary context switches.
    int nonvoluntary_ctxt_switches;    //Number of involuntary context switches.
};

// -----------------------------------------------------------
// a series of functions for collecting information from /procfs
// -----------------------------------------------------------

bool GetProcessStat(pid_t pid, struct ProcessStat *proc);
char* GetProcessName(pid_t pid);
char* GetProcessNameFromCmdLine(char* cmdLine);
pid_t GetProcessPgid(pid_t pid);
bool LookupProcessByPid(pid_t pid);
bool LookupProcessByPgid(pid_t pid);
bool LookupProcessByName(const char* procName);
pid_t LookupProcessPidByName(const char* name);
int GetMaximumPID();
int FilterForPid(const struct dirent *entry);
int GetCpuUsage(pid_t pid);
int GetRunningPids(pid_t** pids);

#endif // PROCFSLIB_PROCESS_H