SHOW:
|
|
- or go back to the newest paste.
1 | #include <stdio.h> | |
2 | #include <string.h> | |
3 | #include <unistd.h> | |
4 | #include <stdlib.h> | |
5 | #include <error.h> | |
6 | #include <sys/types.h> | |
7 | ||
8 | int main(int argc, char **argv){ | |
9 | int p[3][2], pid, i, count[3] = {0}; | |
10 | - | FILE *f[3]; // array di files |
10 | + | FILE *f[4]; // array di files |
11 | char buf[3][10]; // array di stringhe, una per ogni stringa inviata da un figlio | |
12 | - | if(argc != 5){ |
12 | + | if(argc != 4){ |
13 | puts("non hai inserito 4 argomenti...e questo non si fa!!1!"); | |
14 | exit(-1); | |
15 | } | |
16 | for(i = 0; i < 3; i++) // creo le tre pipes | |
17 | pipe(p[i]); | |
18 | for(i = 0; i < 3; i++){ | |
19 | pid = fork(); // creo tre processi figlio, uno ad ogni iterazione | |
20 | if(pid == 0){ | |
21 | close(p[i][0]); | |
22 | f[i] = fopen(argv[i],"r"); // apro in lettura il file relativo all'i-esimo figlio | |
23 | while(count[i] < 3){ // conto fino a 3... | |
24 | write(p[i][1],fgetc(f[i]),1); // ...e leggo un carattere per volta e lo dò al padre tramite il canale in scrittura della pipe sempre dell'i-esimo figlio | |
25 | count[i]++; | |
26 | - | else{ |
26 | + | |
27 | - | read(p[i][0],buf[i],3); |
27 | + | |
28 | } | |
29 | } | |
30 | - | if(strcmp(buf[1],buf[2]) && strcmp(buf[2],buf[3])) |
30 | + | wait(NULL); // siamo nel processo padre; a questo punto aspettiamo un attimo i figli |
31 | for(i = 0; i < 3; i++) | |
32 | close(p[i][1]); // chiudo i canali in scrittura delle tre pipes | |
33 | - | |
33 | + | for(i = 0; i < 3; i++) |
34 | read(p[i][0],buf[i],3); // leggo le tre stringhe | |
35 | if(strcmp(buf[1],buf[2]) && strcmp(buf[2],buf[3])){ // se sono uguali, copincollo le stringhe di tre caratteri nel 4° file | |
36 | puts("I tre caratteri inviati dai figli ai padri sono uguali per tutti."); | |
37 | f[4] = fopen(argv[4],"w"); | |
38 | fprintf(f[4],"%s %s %s", buf[1],buf[2],buf[3]); | |
39 | } | |
40 | else | |
41 | puts("I tre caratteri inviati dai figli ai padri non sono uguali per tutti."); | |
42 | return 0; | |
43 | } |