-
Notifications
You must be signed in to change notification settings - Fork 0
/
process_info.c
153 lines (142 loc) · 2.94 KB
/
process_info.c
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
#include "process_info.h"
extern size_t buffer_size;
extern int path_length;
char* process_mem(pid_t pid)
{
size_t buffer_size = 1000;
char *proc_stat = (char *) malloc(sizeof(char) * 50);
sprintf(proc_stat, "/proc/%d/status", pid);
int fd = open(proc_stat, O_RDONLY);
if(fd == -1)
{
perror("proc file:");
return '\0';
}
char *str = (char *) malloc(sizeof(char) * buffer_size);
char delim[10] = " \t\n";
char *mem;
int read_value;
/*
We iterate over the file until
"VmSize:" is found, then the
next value read is size.
*/
do{
read_value = read(fd, str, buffer_size);
if(read_value == -1)
{
perror("read in process status");
exit(1);
}
mem = strtok(str, delim);
while(mem != NULL)
{
mem = strtok(NULL, delim);
if(strcmp(mem, "VmSize:") == 0)
{
mem = strtok(NULL, delim);
return mem;
}
}
}while(read_value > 0);
close(fd);
return '\0';
}
char* process_name(pid_t pid)
{
size_t buffer_size = 100;
char *proc_stat = (char *) \
malloc(sizeof(char) * 50);
sprintf(proc_stat, "/proc/%d/status", pid);
int fd = open(proc_stat, O_RDONLY);
if(fd == -1)
{
// perror("proc file:");
return '\0';
}
char *str = (char *) malloc(sizeof(char) * \
buffer_size);
int read_value = read(fd, str, buffer_size);
if(read_value == -1)
{
perror("read");
return '\0';
}
char delim[10] = " \t\n";
char *name = strtok(str, delim);
name = strtok(NULL, delim);
close(fd);
return name;
}
/*
Function which returns the process path
based on the exe symlink present in /proc
folder of the given pid
*/
char* process_path(pid_t pid)
{
size_t buffer_size = 1000;
char *proc_exe = (char *) malloc(sizeof(char) * 50);
sprintf(proc_exe, "/proc/%d/exe", pid);
char *path = (char *) malloc(sizeof(char) * buffer_size);
/*
readlink to read the path of the given pid
*/
if(readlink(proc_exe, path, buffer_size) == -1)
{
perror("ReadLink:");
return '\0';
}
return path;
}
/*
Process which return the status of
the process. It is read from
/proc/<pid>/status
*/
char* process_status(pid_t pid)
{
size_t buffer_size = 100;
char *proc_stat = (char *) malloc(sizeof(char) * 50);
sprintf(proc_stat, "/proc/%d/status", pid);
/*
Opening the status file for
the given pid, this contains
the Status of the process
*/
int fd = open(proc_stat, O_RDONLY);
if(fd == -1)
{
perror("proc file:");
return '\0';
}
char *str = (char *) malloc(sizeof(char) * buffer_size);
char delim[10] = " \t\n";
char *name;
int read_value;
/*
Read the file until "State:"
is found, after that, the next
value read which is the status.
*/
do{
read_value = read(fd, str, buffer_size);
if(read_value == -1)
{
perror("read in process status");
return '\0';
}
name = strtok(str, delim);
while(name != NULL)
{
name = strtok(NULL, delim);
if(strcmp(name, "State:") == 0)
{
name = strtok(NULL, delim);
return name;
}
}
}while(read_value > 0);
close(fd);
return '\0';
}