-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
101 lines (89 loc) · 2.41 KB
/
main.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
#include <stdio.h>
#define PIDS 500
#define SYSCALLS 400
int pids[PIDS];
int syscall_x_pids[PIDS][SYSCALLS];
void init_data_structures() {
int i;
int j;
for (i = 0; i < PIDS; i++) {
pids[i] = -1;
for (j = 0; j < SYSCALLS; j++) {
syscall_x_pids[i][j] = 0;
}
}
}
int search(int* pids, int pid) {
int i;
for (i = 0; i < PIDS; i++) {
if (pids[i] == pid) {
return i;
}
}
return -1;
}
void intercept(int pid, int syscall_id) {
int empty_index = -1;
int pid_index = search(pids, pid); // O(N)
if (pid_index > -1){
// Existe el pid en nuestra estructura de datos y por lo tanto está vivo.
syscall_x_pids[pid_index][syscall_id] += 1;
} else {
// No existe en nuestra estructura de datos.
empty_index = search(pids, -1);
if (empty_index <= -1) {
// No hay espacio para guardar más procesos.
printf("No tenemos más espacio");
} else {
// Hay espacio y hay que guardarlo.
pids[empty_index] = pid;
for (int i = 0; i < SYSCALLS; i++) {
syscall_x_pids[empty_index][i] = 0;
}
syscall_x_pids[empty_index][syscall_id] = 1;
}
}
}
void kill(int pid) {
// Asumiendo que el proceso se esta por matar.
// Limpiar la estructura de datos.
int pid_index = search(pids, pid);
if (pid_index > -1) {
pids[pid_index] = -1;
for (int i = 0; i < SYSCALLS; i++) {
syscall_x_pids[pid_index][i] = 0;
}
} else {
// Es la primera syscall que se ejecuta de este proceso, ignoramos...
}
}
void print_data_structures() {
int i;
int j;
for (i = 0; i < PIDS; i++) {
for (j = 0; j < SYSCALLS; j++) {
if (pids[i] > 0 && syscall_x_pids[i][j] > 0) {
printf("PID: %d - SYSCALL(%d) = %d\n", pids[i], j, syscall_x_pids[i][j]);
}
}
}
}
int main (void) {
printf("INICIADO\n");
init_data_structures();
// Simulacion de intercepciones
intercept(902, 12);
intercept(902, 12);
intercept(903, 12);
intercept(903, 12);
intercept(902, 13);
kill(902);
intercept(904, 1);
intercept(905, 100);
intercept(903, 12);
intercept(903, 10);
intercept(902, 2);
// Print de la estructura de datos
print_data_structures();
printf("FINALIZADO\n");
}