-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimulacion.c
More file actions
138 lines (127 loc) · 5.23 KB
/
simulacion.c
File metadata and controls
138 lines (127 loc) · 5.23 KB
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
//Antoni Font, Pedro Bustamante, Pavel Ernesto Garcia
#include "simulacion.h"
#include "directorios.h"
#include "semaforo_mutex_posix.h"
#include <sys/wait.h>
#include <signal.h>
int acabados = 0;
int main(int argc, char **argv)
{
if (argc > 1)
{
//montamos el dispositivo padre
bmount(argv[1]);
//Creamos el formato del direcorio de simulación: /simul_aaaammddhhmmss/
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char camino[1000];
char *formato = "/simul_%Y%m%d%H%M%S/";
strftime(camino, sizeof(camino), formato, tm);
strcat(camino,"\0");
printf("\n");
if (mi_creat(camino, 6) != -1)
{
pid_t pid;
signal(SIGCHLD, reaper);
for (int proceso = 1; proceso <= NUMPROCESOS; proceso++)
{
pid = fork();
// si es el hijo
if (pid == 0)
{
bmount(argv[1]);
// Crear el directorio del proceso añadiendo el PID al nombre
char directorioProceso[2000];
memset(directorioProceso, 0, sizeof(directorioProceso));
sprintf(directorioProceso, "%sproceso_%d/", camino, getpid());
strcat(directorioProceso,"\0");
mi_creat(directorioProceso, 6);
char ficheroProceso[3000];
memset(ficheroProceso, 0, sizeof(ficheroProceso));
sprintf(ficheroProceso, "%sprueba.dat", directorioProceso);
strcat(ficheroProceso,"\0");
mi_creat(ficheroProceso, 6);
//inicializamos la semilla
srand(time(NULL) + getpid());
for (int nEscritura = 1; nEscritura <= NUMESCRITURAS; nEscritura++)
{
struct REGISTRO registro;
registro.fecha = time(NULL);
registro.pid = getpid();
registro.nEscritura = nEscritura;
registro.nRegistro = rand() % REGMAX;
mi_write(ficheroProceso, ®istro, (registro.nRegistro) * sizeof(registro), sizeof(registro));
my_sleep(50);
if(proceso==1){
printf("\x1b[31m[simulación.c → Escritura %d en %s]\x1b[41m\x1b[0m\n", nEscritura, ficheroProceso);
}else if(proceso==2){
printf("\x1b[36m[simulación.c → Escritura %d en %s]\x1b[46m\x1b[0m\n", nEscritura, ficheroProceso);
}else{
printf("[simulación.c → Escritura %d en %s]\n", nEscritura, ficheroProceso);
}
}
if(proceso==1){
printf("\x1b[31m[Proceso %d: Completadas %d escrituras en %s]\x1b[41m\x1b[0m\n",proceso,NUMESCRITURAS,ficheroProceso);
}else if(proceso==2){
printf("\x1b[36m[Proceso %d: Completadas %d escrituras en %s]\x1b[46m\x1b[0m\n",proceso,NUMESCRITURAS,ficheroProceso);
}else if(proceso==3){
printf("\x1b[37m[Proceso %d: Completadas %d escrituras en %s]\x1b[47m\x1b[0m\n",proceso,NUMESCRITURAS,ficheroProceso);
}else if(proceso==4){
printf("\x1b[39m[Proceso %d: Completadas %d escrituras en %s]\x1b[49m\x1b[0m\n",proceso,NUMESCRITURAS,ficheroProceso);
}else{
printf("[Proceso %d: Completadas %d escrituras en %s]\n",proceso,NUMESCRITURAS,ficheroProceso);
}
printf("\n[Proceso %d: Completadas %d escrituras en %s]\n",proceso,NUMESCRITURAS,ficheroProceso);
bumount();
exit(0);
}
// Esperar 0,15 seg para lanzar siguiente proceso
my_sleep(150);
}
// Permitir que el padre espere por todos los hijos:
// Mientras acabados < NUMPROCESOS hacer
// pause();
// fmientras
while (acabados < NUMPROCESOS)
{
pause();
}
}
bumount();
exit(0);
}
else
{
printf("Sintaxis: ./simulacion <disco>\n");
}
}
void my_sleep(unsigned msec)
{ // recibe tiempo en milisegundos
struct timespec req, rem;
int err;
req.tv_sec = msec / 1000; // conversión a segundos
req.tv_nsec = (msec % 1000) * 1000000; // conversión a nanosegundos
while ((req.tv_sec != 0) || (req.tv_nsec != 0))
{
if (nanosleep(&req, &rem) == 0)
// rem almacena el tiempo restante si una llamada al sistema
// ha sido interrumpida por una señal
break;
err = errno;
// Interrupted; continue
if (err == EINTR)
{
req.tv_sec = rem.tv_sec;
req.tv_nsec = rem.tv_nsec;
}
}
}
void reaper()
{
pid_t ended;
signal(SIGCHLD, reaper);
while ((ended = waitpid(-1, NULL, WNOHANG)) > 0)
{
acabados++;
}
}