View difference between Paste ID: vmHLwtt1 and J8a0axvG
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
}