Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <string.h>
- /*Esame 11 Luglio 2012*/
- /*Tipo di Dato pipe*/
- typedef int pipe_t[2];
- /*Dichiarazione Esplicita Funzione Figlio*/
- int figlio(char *Fi,int indice);
- /*Variabili Globali*/
- int K; /*Numero passato come ultimo Parametro*/
- int N; /*Numero di file passati come parametri*/
- int dim,retval;
- int pid;/*PID per creazione figli*/
- char Fout[256];/*Nome file creato dal padre*/
- int fdout;/*File decriptor file Fout*/
- char Media[12];/*Stringa contenente la scritta Equal-Sopra-Sotto Media*/
- char str[256];/*Stringa di appoggio per scrittura in stdout*/
- pipe_t *pfd_p;
- pipe_t *pfd_f;
- /*NOTA:Si utilizzano 2N pipe !!*/
- /*N pipe pfd_p per la comunicazione figli-padre*/
- /*N pipe pfd_f per la comunicazione padre-figli*/
- int main(int argc,char **argv ){
- /*Variabili Locali*/
- int i,st;
- long int cont_ch;/*Variabile long int per lettura da pipe pfd_f*/
- /*Controllo numero parametri*/
- dim=argc-1;
- if (dim<3){
- snprintf(str,256,"USO scheletro F1 F2 FN M \n");
- write(1,str,strlen(str));
- return(1);
- }
- /*Controllo sul numero K*/
- K=atoi(argv[dim]);
- if (K <= 0){
- snprintf(str,256,"Inserire K intero strettamente positivo \n");
- write(1,str,strlen(str));
- return(2);
- }
- /*Creazione file Fout*/
- snprintf(Fout,256,"output.%d",K);
- fdout=creat(Fout,0644);
- if (fdout<0){
- snprintf(str,256,"Impossibile creare il file %s \n",Fout);
- write(1,str,strlen(str));
- return(3);
- }
- /*Assegno Numero di figli*/
- N=dim-1;
- /*Allocazione dinamica pipe pfd_p*/
- pfd_p=(pipe_t*)malloc(sizeof(pipe_t)*N);
- if (pfd_p==NULL){
- snprintf(str,100,"Errore allocazione pipe pfd_p \n ");
- write(1,str,strlen(str));
- return(4);
- }
- /*Creazione Pipe pfd_p*/
- for (i=0;i<N;i++){
- retval=pipe(pfd_p[i]);
- if (retval!=0){
- snprintf(str,100,"Errore nella creazione della pipe pfd_p %d \n ",i);
- write(1,str,strlen(str));
- return(5);
- }
- }
- /*Allocazione dinamica pipe pfd_f*/
- pfd_f=(pipe_t*)malloc(sizeof(pipe_t)*N);
- if (pfd_f==NULL){
- snprintf(str,100,"Errore allocazione pipe pfd_f \n ");
- write(1,str,strlen(str));
- return(6);
- }
- /*Creazione Pipe pfd_f*/
- for (i=0;i<N;i++){
- retval=pipe(pfd_f[i]);
- if (retval!=0){
- snprintf(str,100,"Errore nella creazione della pipe pfd_f %d \n ",i);
- write(1,str,strlen(str));
- return(7);
- }
- }
- /*Creazione figli*/
- for (i=0;i<N;i++){
- pid=fork();
- switch(pid){
- case 0: /*Figlio*/
- return (figlio(argv[i+1],i));
- case -1:/*Errore*/
- snprintf(str,100,"Errore creazione figlio numero %d PID %d \n ",i,pid);
- write(1,str,strlen(str));
- return(8);
- }
- }
- /*Se arrivo qui sono il padre*/
- /*Chiudo i lati delle pipe che il padre non usa*/
- /*Il padre scrive solo sulle pipe pfd_p*/
- /*Il padre legge solo dalle pipe pfd_f*/
- for (i=0;i<N;i++){
- close(pfd_f[i][1]);
- close(pfd_p[i][0]);
- }
- /*Per ogni figlio*/
- for (i=0;i<N;i++){
- /*Leggo il valore dalla pipe pfd_f*/
- if (read(pfd_f[i][0],&cont_ch,sizeof(long int))!=sizeof(long int)) {
- fprintf(stderr,"Impossibile leggere cont_ch\n");
- abort();
- }
- if (cont_ch>K){
- /*Preparo la stringa Sopra Media per il figlio */
- snprintf(Media,12,"Sopra Media");
- }
- if (cont_ch==K){
- /*Preparo la stringa Equal Media per il figlio */
- snprintf(Media,12,"Equal Media");
- }
- if (cont_ch<K){
- /*Preparo la stringa Sotto Media per il figlio */
- snprintf(Media,12,"Sotto Media");
- }
- /*Scrivo stringa al figlio su pfd_p[i]*/
- write(pfd_p[i][1],Media,12);
- }
- /*Stampo i valori di uscita dei figli*/
- for (i=0;i<N;i++){
- /*Attendo i figli e stampo il valori di uscita*/
- pid=wait(&st);
- snprintf(str,256,"Figlio con PID %d RITORNA %d \n",pid,WEXITSTATUS(st));
- write(1,str,strlen(str));
- }
- return(0);
- }
- int figlio(char *Fi,int indice){
- /*Ogni figlio e' associato a un file Fi*/
- /*Ogni figlio calcola la lunghezza del file Fi*/
- /*Comunica la lunghezza al processo padre su pfd_f[indice]*/
- /*Riceve la stringa comunicata dal padre su pfd_p[indice]*/
- /*Scrive la stringa su Fout*/
- int i;/*Indice generico*/
- int fd;/*File descriptor file Fi*/
- char ch;/*Carattere di appoggio per lettura dal file Fi*/
- long int cont_ch;/*Contatore caratteri*/
- char temp[256];/*Buffer per scrittura su Fout*/
- /*Stampa di Controllo*/
- snprintf(str,256,"Figlio INDICE %d FILE %s \n",indice,Fi);
- write(1,str,strlen(str));
- /*Chiusura lati pipe non utilizzati pfd_f*/
- /*Ogni figlio usa solo la pipe pfd_f[indice]*/
- for (i=0;i<N;i++){
- if (i!=indice){
- close(pfd_f[i][0]);
- close(pfd_f[i][1]);
- }
- }
- /*Scrivo SOLO sulla mia pipe pfd_f*/
- close(pfd_f[indice][0]);
- /*Chiusura lati pipe non utilizzati pfd_p*/
- /*Ogni figlio usa solo la pipe pfd_p[indice]*/
- for (i=0;i<N;i++){
- if (i!=indice){
- close(pfd_p[i][0]);
- close(pfd_p[i][1]);
- }
- }
- /*Leggo SOLO dalla mia pipe pfd_p*/
- close(pfd_p[indice][1]);
- /*Apertura file associato Fi*/
- fd=open(Fi,O_RDONLY);
- if (fd<0){
- snprintf(str,256,"Figlio INDICE %d Impossibile aprire file %s \n",indice,Fi);
- write(1,str,strlen(str));
- }
- /*Inizializzo variabile contatore caratteri*/
- cont_ch=0;
- /*Scansione file fd per conteggio caratteri*/
- while(read(fd,&ch,1)>0){
- /*Ho letto un carattere*/
- /*Incremento contatore*/
- cont_ch++;
- }
- /*oppure molto piu' semplicemente si poteva usare la funzione lseek*/
- /* cont_ch=lseed(fd, 0L, 2) */
- /*Comunico al padre la lunghezza in caratteri del file*/
- write(pfd_f[indice][1],&cont_ch,sizeof(long int));
- /*Attendo la stringa che mi scrive il padre*/
- if (read(pfd_p[indice][0],Media,12)!=12) {
- fprintf(stderr,"Lettura invalida da pdf_d[%d][0]\n",indice);
- exit(-1);
- }
- /*Scrivo sul file Fout stringa concatenata*/
- snprintf(temp,256,"%s %s\n",Fi,Media);
- write(fdout,&temp,strlen(temp));
- /*Controllo valore scritto dal padre su pipe pfd_p*/
- if(strcmp(Media,"Sopra Media")==0){
- retval=2;
- }
- if(strcmp(Media,"Sotto Media")==0){
- retval=1;
- }
- if(strcmp(Media,"Equal Media")==0){
- retval=0;
- }
- /*Ritorno retval al padre*/
- return(retval);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement