forked from fbaiodias/so
-
Notifications
You must be signed in to change notification settings - Fork 0
/
leitor-pai.c
106 lines (88 loc) · 2.88 KB
/
leitor-pai.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
/* Grupo 55
*
* Cristiano Rocha nº62502
* Pedro Saraiva nº70848
* Francisco Dias nº75328
*
* Exercício 4
* */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "consts.h"
/*-------------------------------------------------------------------------------------
| fixed strings
+-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------
| main
+-------------------------------------------------------------------------------------*/
int main (int argc, char** argv) {
pid_t *childPids = NULL; /* array de pids dos filhos */
pid_t *childReturnValues = NULL; /* array de pids dos filhos */
pid_t p;
/* Initialize the seed of random number generator */
srandom ((unsigned) time(NULL));
int status, valorExit, random;
int i;
int waitingForChildren = 1;
childPids = malloc(N_READER_CHILDREN * sizeof(pid_t));
childReturnValues = malloc(N_READER_CHILDREN * sizeof(int));
for (i = 0; i < N_READER_CHILDREN; ++i) {
/* se p == 0 estamos no processo pai por isso criamos um filho. */
random = get_random(N_FILES);
if ((p = fork()) == 0) {
char c[2];
sprintf(c, "%d", random);
if(execl(READER_EXEC_PATH, READER_EXEC_PATH, c, NULL) == -1){
perror("Could not execute child program.");
exit(-1);
}
}
/* caso contrário estamos no processo filho e guardamos o pid no array de pids */
else if(p < 0){
perror("Could not fork a child.");
exit(-1);
}
else {
childPids[i] = p;
}
}
/* ciclo "infinito" para esperar que todos os filhos acabem. enquanto um dos filhos não tiver acabado o ciclo continua */
while (waitingForChildren != 0) {
waitingForChildren = 0;
for (i = 0; i < N_READER_CHILDREN; ++i) {
if (childPids[i] > 0) {
/* usamos WNOHANG para que o programa não pare à espera que o filho acabe. assim podemos continuar o ciclo e verificar os restantes filhos */
if (waitpid(childPids[i], &status, WNOHANG) != 0) {
if (WIFEXITED(status)) {
valorExit = (char) WEXITSTATUS(status);
printf("Child: %d ended with return value %d\n", childPids[i], valorExit);
childPids[i] = 0;
childReturnValues[i] = valorExit;
}
else {
perror("Child didn't exit or return");
}
}
else {
/* continuamos à espera que os filhos acabem */
waitingForChildren = 1;
}
}
}
}
printf("\n\nAll done!\n\n");
for (i = 0; i < N_READER_CHILDREN; ++i) {
printf("#%d child returned %d\n", i, childReturnValues[i]);
}
/* Cleanup */
free(childPids);
free(childReturnValues);
return 0;
}