#include #include #include #include #include #include #include typedef int pipe_t[2]; /* tipo per la pipe */ /* variabili globali dato che questa soluzione usa una funzione figlio a cui serve la visibilita' di queste variabili */ pipe_t *pipesU; /* pipes di Psopra */ pipe_t *pipesD; /* pipes di Psotto */ int pid; /* appoggio per valore pid (pid unico)*/ int status; /* appoggio per wait */ int fd; /* per la gestione dei file creati */ int nrp; /* per la gestione dei del valore di ritorno della read da pipe */ char *Fsopra; /* stringa per il nome del file Fsopra */ char *Fsotto; /* stringa per il nome del file Fsotto */ int Nfigli,Npipe; /* numero di figli e numero di pipe da creare */ int H,N; /* variabili per salvare i parametri una volta convertiti da stringhe a numeri interi */ /* abbinamento snprintf+write */ void zprintf(int fd, const char *fmt, ...); int figlio(char *filename,int indice); int main(int argc, char **argv) { int i; /* int di appoggio */ int pid_sopra, pid_sotto; /* per salvare i pid dei due processi speciali */ /* controllo numero di argomenti */ if (argc!=4) { zprintf(2,"Errore nel numero di argomenti\n"); return 1; } /*CONTROLLO PARAMETRI*/ N=atoi(argv[2]); /*N=numero linee del file*/ if(N <= 0) { zprintf(2,"Errore il secondo parametro non strettamente positivo\n"); return 2; } H=atoi(argv[3]); if(H < 0) { zprintf(2,"Errore il terzo parametro non positivo\n"); return 3; } /* allocazione di due stringhe */ Fsotto=malloc(strlen(argv[1])+1+strlen(".sotto")); Fsopra=malloc(strlen(argv[1])+1+strlen(".sopra")); if(Fsotto==NULL||Fsopra==NULL) { zprintf(2,"errore nella malloc delle stringhe\n"); return 4; } /*creazione di Fsotto ed Fsopra*/ sprintf(Fsopra,"%s.sopra",argv[1]); fd=creat(Fsopra,0644); if(fd < 0) { zprintf(2,"Errore creazione file Fsopra %d\n", Fsopra); return 5; } close(fd); /* chiudiamo il file appena creato dato che il padre non lo usa */ sprintf(Fsotto,"%s.sotto",argv[1]); fd=creat(Fsotto,0644); if(fd < 0) { zprintf(2,"Errore creazione file Fsopra %d\n", Fsopra); return 6; } close(fd); /* chiudiamo il file appena creato dato che il padre non lo usa */ Npipe=N; /* allocazione dei due array di pipe */ pipesU=malloc(sizeof(pipe_t)*Npipe); pipesD=malloc(sizeof(pipe_t)*Npipe); if(pipesU==NULL||pipesD==NULL) { zprintf(2,"errore nella malloc del vettore di pipe\n"); return 7; } /* creazione dei due array di pipe */ for(i=0;i=H) write(pipesD[indice][1],cs,sizeof(cs)); else write(pipesU[indice][1],cs,sizeof(cs)); return (i); } else i = 0; /* si deve azzerare l'indice della linea */ } } return i; /* questo return serve solo se l'ultima linea non termina con il corretto terminatore di linea (\n) */ } else { /* codice dei figli Psopra e Psotto */ /* stampa di controllo zprintf(2,"sono il figlio Psopra o Psotto %d\n",getpid()); */ /* apriamo in scrittura il file creato dal padre */ fd=open(filename,O_WRONLY); if(fd<0) { zprintf(2,"Errore nell'apertura del file %s\n",filename); return 1; } /* chiusura pipe */ for(i=0;i