[C]Problema in lettura con le pipe
Inviato: giovedì 28 maggio 2015, 20:26
Ciao a tutti ragazzi.Stavo creando un programmino per esercitarmi.Questo programmino dovrebbe far creare al processo padre un array e inizializzarlo e il processo figlio dovrebbe (con l'ausilio dei thred) modificarlo.L'array modificato poi dovrebbe essere passato al padre.Sono riuscito a scrivere tutto il programma e non ci sono errori ne in fase di compilazione ne di linking.Il problema è che il processo padre non legge in modo corretto l'array modificato dal figlio e sinceramente non riesco a capire il perchè.Posto di seguito il codice:
Codice: Seleziona tutto
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<errno.h>
#include<unistd.h>
#include<pthread.h>
#define WRITE 1
#define READ 0
struct argomenti{
int* array;
int size;
};
void* funz_start(void* arg){
struct argomenti *a=(struct argomenti*)arg;
int i;
for(i=0;i<a->size;i++)
a->array[i]=i+2;
return((void*)1);
}
int main(int argc,char* argv[]){
srand(time(NULL));
pid_t pid;
int* array;
int size;
int status;
int fd[2];
int* buffer;
int i;
int nread;
printf("\nSono il processo padre con pid %d e inizializzo l'array!\n",getpid());
size=1+rand()%10;
array=calloc(size,sizeof(int));
buffer=calloc(size,sizeof(int));
pid=fork();
if(pid<0){
fprintf(stderr,"\nErrore %d nella creazione del processo figlio!\n",errno);
exit(-1);
}
if(pid>0){
waitpid(pid,&status,0);
close(fd[WRITE]);
nread=read(fd[READ],buffer,sizeof(int)*size);
printf("\nIl valore dell'array modificato da mio figlio e':\n");
for(i=0;i<size;i++)
printf("\nCella %d---->%d\n",i,buffer[i]);
printf("\nMio figlio %d e' ritornato con lo stato %d\n",pid,status);
close(fd[READ]);
}
else{
close(fd[READ]);
int size_temp;
printf("\nSono il processo figlio di %d e ho pid %d\nModifico l'array!",getppid(),getpid());
pthread_t tpid1;
int err;
void* rit;
int i;
struct argomenti arg_tpid1;
if(size%2==0){
size_temp=size/2;
arg_tpid1.size=size/2;
}else{
arg_tpid1.size=size-2;
size_temp=size-(arg_tpid1.size);
}
arg_tpid1.array=calloc(arg_tpid1.size,sizeof(int));
err=pthread_create(&tpid1,NULL,funz_start,(void*)&arg_tpid1);
if(err!=0){
printf("\nErrore nella creazione del thread!\n");
}
else{
sleep(2);
pthread_join(tpid1,&rit);
printf("\nIl thread e' ritornato con il seguente stato %ld\n",(long)rit);
}
for(i=0;i<arg_tpid1.size;i++)
array[i]=arg_tpid1.array[i];
for(i=arg_tpid1.size;i<size;i++){
array[i]=i+3;
}
printf("\nStampiamo il valore dell'array modificato da me!\n");
for(i=0;i<size;i++){
printf("\nCella %d---->%d\n",i,array[i]);
buffer[i]=array[i];
}
printf("\nPasso l'array modificato a mio padre!\n");
write(fd[WRITE],buffer,sizeof(int)*size);
close(fd[WRITE]);
exit(2);
}
free(array);
free(buffer);
exit(0);
}