-
Notifications
You must be signed in to change notification settings - Fork 0
/
p3.c
197 lines (142 loc) · 5.42 KB
/
p3.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
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
/* Claudia Maciel Montero */
/* c.maciel */
/* Sergio Vila Riveira */
/* sergio.vila1 */
#include <stdio.h>
#include <string.h>
#include "comandos.h"
#define MAX_TROZOS 1024
#define MAX_COM 1024
int TrocearCadena(char *cadena, char *trozos[]){
int i = 1;
if((trozos[0] = strtok(cadena, " \n\t")) == NULL)
return 0;
while((trozos[i] = strtok(NULL, " \n\t")) != NULL)
i++;
return i;
}
void imprimirPrompt(){
printf("$ ");
}
void procesarEntrada(char *trozos[], int ntrozos, int argc, char* argv[], char* envp[],
List *head, MemList *M, MemList *S, MemList *MP, ProcList *L){
int i;
char *ejecutable[50] = {};
if(strcmp(trozos[0], "autores") == 0) // Autores
autores(trozos[1], ntrozos);
else if(strcmp(trozos[0], "pid") == 0) //Pid
pid(trozos[1], ntrozos);
else if(strcmp(trozos[0], "fecha") == 0) // Fecha
fecha(trozos[1], ntrozos);
else if(strcmp(trozos[0], "infosis") == 0) // Infosis
infosis();
else if(strcmp(trozos[0], "hist") == 0) // Hist
hist(trozos[1], ntrozos, head);
else if(strcmp(trozos[0], "carpeta") == 0) // Carpeta
carpeta(trozos, ntrozos);
else if(strcmp(trozos[0], "comando") == 0) // ComandoN
comandoN(trozos[1], ntrozos, argc, argv, envp, head, M, S, MP, L);
else if(strcmp(trozos[0], "salir") == 0 || strcmp(trozos[0], "bye") == 0 || strcmp(trozos[0], "fin") == 0) // Salir (salir, bye, fin)
salir(trozos[0]);
else if(strcmp(trozos[0], "ayuda") == 0) // Ayuda
ayuda(trozos[1], ntrozos);
else if(strcmp(trozos[0], "create") == 0) // Create
create(trozos, ntrozos);
else if(strcmp(trozos[0], "stat") == 0) // Stat
stats(trozos, ntrozos);
else if(strcmp(trozos[0], "list") == 0) // List
list(trozos, ntrozos);
else if(strcmp(trozos[0], "delete") == 0) // Delete
delete(trozos, ntrozos);
else if(strcmp(trozos[0], "deltree") == 0) // DelTree
deltree(trozos, ntrozos);
else if(strcmp(trozos[0], "allocate") == 0) // Allocate
allocate(trozos, M, S, MP);
else if(strcmp(trozos[0], "deallocate") == 0) // Deallocate
deallocate(trozos, M, S, MP);
else if(strcmp(trozos[0], "i-o") == 0) // i-o
i_o(trozos);
else if(strcmp(trozos[0], "memdump") == 0) // Memdump
memdump(trozos, ntrozos);
else if(strcmp(trozos[0], "memfill") == 0) // Memfill
memfill(trozos, ntrozos);
else if(strcmp(trozos[0], "memory") == 0) // Memory
memory(trozos, *M, *S, *MP);
else if(strcmp(trozos[0], "recursiva") == 0) // Recursiva
recursiva(trozos[1]);
else if(strcmp(trozos[0], "priority") == 0) // Priority
priority(trozos, ntrozos);
else if(strcmp(trozos[0], "showvar") == 0) // Showvar
showvar(trozos, envp);
else if(strcmp(trozos[0], "changevar") == 0) // Changevar
changevar(trozos, ntrozos, envp);
else if(strcmp(trozos[0], "showenv") == 0) // Showenv
showenv(trozos, envp);
else if(strcmp(trozos[0], "fork") == 0) // Fork
forkin(L);
else if(strcmp(trozos[0], "listjobs") == 0) // Listjobs
listjobs(L);
else if(strcmp(trozos[0], "deljobs") == 0) // Deljobs
deljobs(trozos, L);
else if(strcmp(trozos[0], "job") == 0) // Job
job(trozos, *L);
else if(strcmp(trozos[0], "execute") == 0) // Execute
execute(trozos, argv, envp);
else {
for(i = 0; trozos[i] != NULL; i++) {
if(strcmp(trozos[i], "&") != 0)
ejecutable[i] = trozos[i];
}
if(strcmp(trozos[i-1], "&") == 0) {
if (segundo_plano(argv, envp, ejecutable, L) == -1)
printf(" No se ha encontrado el comando\n");
}
else if(primer_plano(argv, envp, trozos) == -1)
printf(" No se ha encontrado el comando\n");
}
}
int leerEntrada(char *cadena, int terminado, int argc, char* argv[], char* envp[],
List *head, MemList *M, MemList *S, MemList *MP, ProcList *L){
char *trozos[MAX_TROZOS];
int ntrozos;
ntrozos = TrocearCadena(cadena, trozos); // Numero de trozos
if(ntrozos != 0) {
terminado = -1;
procesarEntrada(trozos, ntrozos, argc, argv, envp, head, M, S, MP, L);
}
else // Si no se escribio nada salir
terminado = 0;
return terminado;
}
int main(int argc, char *argv[], char *envp[]){
char comando[MAX_COM];
int terminado = -1;
List head;
createlist(&head);
MemList mallocList;
MemList sharedList;
MemList mapList;
ProcList procList;
createProcList(&procList); // Crear la lista de procesos
while (terminado != 0){
imprimirPrompt();
fgets(comando, MAX_COM, stdin);
if (insertItem(comando, &head)) // Añadir el comando a la lista
terminado = leerEntrada(comando, terminado, argc, argv, envp,
&head, &mallocList, &sharedList, &mapList, &procList);
else {
printf(" * Error: lista vacia\n"); // No se pudo insertar (se borro la lista...)
createlist(&head); // Crear la lista
}
}
deleteList(&head);
if(mallocList != NULL)
deleteMemList(&mallocList);
if(sharedList != NULL)
deleteMemList(&sharedList);
if(mapList != NULL)
deleteMemList(&mapList);
if(procList != NULL)
deleteProcList(&procList);
return 0;
}