-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocesos.c
More file actions
executable file
·70 lines (59 loc) · 1.14 KB
/
procesos.c
File metadata and controls
executable file
·70 lines (59 loc) · 1.14 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
#ifdef SEMAFOROS
#include "semaphores.h"
#else
#include "mensajes.h"
#endif
#define CICLOS 10
int idsem = -1;
char *pais[3]={"Peru", "Bolivia", "Colombia"};
int *g;
int main() {
int pid;
int status;
int args[3];
int i;
srand(getpid());
#ifdef SEMAFOROS
seminit(&idsem, 1);
#else
queueinit(&idsem);
#endif
for (i=0;i<3;i++) {
// Crea un nuevo proceso hijo que ejecuta la función proceso()
pid=fork();
if (pid==0)
proceso(i);
}
for(i=0;i<3;i++)
pid = wait(&status);
#ifndef SEMAFOROS
// Eliminamos la cola de mensajes
msgctl(idsem, IPC_RMID, NULL);
#endif
return 0;
}
void proceso(int i) {
int k;
int l;
for (k=0;k<CICLOS;k++) {
// Entrada a la sección crítica
#ifdef SEMAFOROS
semwait(idsem);
#else
queuewait(idsem);
#endif
printf("Entra %s ", pais[i]);
fflush(stdout);
sleep(rand() % 3);
printf("- %s Sale\n", pais[i]);
// Salida de la sección crítica
#ifdef SEMAFOROS
semsignal(idsem);
#else
queuesignal(idsem);
#endif
// Espera aleatoria fuera de la sección crítica
sleep(rand()%3);
}
exit(0);
}