Ciao a tutti!!!!!
ho un problema nel mio programma....e ormai sono un bel po di ore che cerco l-errore so che e' davanti ai miei occhi ma nn riesco a vederlo
Qualcuno riesci a darmi una mano?
Allora il programma non fa altro che creare due processi figli (P1 e P2) che devono comunicare
tra loro e con il padre mediante pipe!
qui sotto copio il pezzo di codice nel main che genera i due figli....
for(i=0; i<N_FIGLI; i++)
{
pid = fork();
if(pid == 0)
{
if(i==0) //corpo di P1
{
//chiudo il lato della pipe che P1 non usa chiudo scrittura
close(pipe_p2_p1[1]); close(pipe_p1_p0[0]);
figlio1(pipe_p2_p1[0], pipe_p1_p0[1], nomeFileIn );// leggo da P2, scrivo a P0
exit(EXIT_SUCCESS);
}//if i==0
else if(i==1) // corpo P2
{
close(pipe_p2_p1[0]);// chiudo lettura
close(pipe_p1_p0[0]);
close(pipe_p1_p0[1]);//chiudo accesso pipe che nn usa P2
figlio2(pipe_p2_p1[1], nomeFileIn); // scrivo a P1
exit(EXIT_SUCCESS);
}
}
else if( pid > 0) //padre
{
}
else // pid < 0 errore
{
perror("Unable To Fork\n\n");
exit(EXIT_FAILURE);
}
}//fine for
ho un file composto da triplette di numeri interi...a cui entrambi i processi figli devono accedere
ora p1 attende che venga scritto un intero sulla pipe_p2_p1 e
p2 ha il compito di leggere, a ogni ciclo, due numeri dal file (saltando poi con una fseek il 3 valore della tripletta), confrontarli e scrivere sulla pipe _p2_p1 il valore maggiore;
p1 a sua volta letto il valore massimo dalla pipe...deve confrontarlo con il terzo valore di ogni tripletta e se questo valore e' minore di quello letto dalla pipe allora p1 sovrascrivera' il terzo valore del file con quello letto dalla pipe ad ogni ciclo....
p1 inoltre invia il valore scelto a p0(il padre) che somma ad ogni ricezione i singoli valori letti...
qui di seguito le due funzioni chiamate rispettivamente da p1 e p2
void figlio1(int fromP2, int toP0, char *file_in)
{
int nwrite, nreadWhile, nreadC, fd, valueC, valueFromP2, nfseek, invio;
fd = open(file_in, O_RDWR);
if(fd <0)// controllo descrittore
{
perror("\nAttenzione il file non trovato ");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
invio = 0;
printf("\nAttendo P2.....");
while( (nreadWhile =read(fromP2, &valueFromP2, sizeof(int))) > 0 )// sincronizzata con la write in P2 tramite pipe
{
printf("\nLeggo da P2");
//devo confrontarlo con il valore C
nfseek = fseek(fd, 2*sizeof(int), SEEK_CUR); // mi sposto di due posizioni cosi da leggere C
if(nfseek != 0)// controllo fseek
{
perror("\nProblema con fseek in P1...");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
nreadC = read(fd, &valueC, sizeof(int)); // leggo il terzo valore di ogni tripletta
if(nreadC < 0)
{
perror("\nAttenzione problemi lettura C value ");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
if(valueFromP2 > valueC) // lo scrivo su file
{
invio = 1;
nfseek = fseek(fd, -sizeof(int), SEEK_CUR); // mi riposiziono indietro per poter riscrivere il valore di C
if(nfseek != 0)// controllo fseek
{
perror("\nProblema con fseek in P1...file");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
nwrite = write(fd, &valueFromP2, sizeof(int));
if(nwrite < 0)
{
perror("\nErrore scrittura in P2\n");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
printf("\nValore di C : %d, Valore : %d.....aggiorno il file!!!\n", valueC, valueFromP2 );
}
if(invio) //spedisco valueFromP2
{
nwrite = write(toP0, &valueFromP2, sizeof(int));
if(nwrite <0)
{
perror("\nErrore scrittura valueFromP2 \n");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
}
else //spedisco valueC
{
nwrite = write(toP0, &valueC, sizeof(int));
if(nwrite <0)
{
perror("\nErrore scrittura valueFromP2 sul file");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
}
invio = 0;
}
if( nreadWhile < 0)//gestione errore...
{
perror("\nErrore nella lettura del valore MAX in P1..\n");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_FAILURE);
}
printf("\nFine Comunicazione con P2....raggiunto EOF\n");
close(toP0);
close(fromP2);
close(fd);
exit(EXIT_SUCCESS);
}
void figlio2(int toP1, char *file_in) // legge due valori e il max lo scrive su pipe....sincronizzata con la read in P1
{
int nwrite, nfseek, max, fd, nread, read_buf[2];
fd = open(file_in, O_RDONLY);
if(fd < 0)
{
perror("\nAttentione file non trovato\n");
close(toP1);
close(fd);
exit(EXIT_FAILURE);
}
printf("\nLEGGO DAL FILE I VALORI.....P2");
while( (nread = read(fd, read_buf, 2*sizeof(int))) > 0)
{
printf("\nLETTI I VALORI : %d , %d....\n", read_buf[0], read_buf[1]);
if(read_buf[0] >= read_buf[1]) /* A >= B */
{
max = read_buf[0];
printf("\nIl valore scelto e A");
}
else
{
max = read_buf[1];
printf("\nIl valore scelto e B");
}
printf("\nMAX in %d vale: %d...",getpid(), max);
nwrite = write(toP1, &max, sizeof(int));
if(nwrite < 0)
{
perror("Attenzione Problema con la write in P2\n");
close(toP1); close(fd);
exit(EXIT_FAILURE);
}
nfseek = fseek(fd, sizeof(int), SEEK_CUR); // salto la entry C
if( nfseek != 0)
{
perror("Attenzione Problema con la fseek in P2\n");
close(toP1); close(fd);
exit(EXIT_FAILURE);
}
printf("\n Rileggo nuovi valori...in P2 dal file...\n");
}// while
if(nread < 0)
{
close(fd);
close(toP1);
exit(EXIT_FAILURE);
}
printf("\nFine File Input Raggiunta\n.....");
close(fd);
close(toP1);//chiudendo l-estremo della pipe segnalo a P1 la fine
exit(EXIT_SUCCESS);
}
mi da il seguente output:
LEGGO DAL FILE I VALORI.....P2
LETTI I VALORI : 15 , -18....
Il valore scelto e A
Attendo P2.....
VALORE SALVATO NEL FILE fileOut CORRETTAMENTE (SOMMA = 0)
cioe' p2 legge i due valori ma sembra non scriverli sulla pipe per p1...
Grazie Mille In Anticipo Per La risposta!!!!!!!!!