Pagina 1 di 1

[C]Problema in lettura con le pipe

Inviato: giovedì 28 maggio 2015, 20:26
da raider91
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);
}



Re: [C]Problema in lettura con le pipe

Inviato: venerdì 29 maggio 2015, 2:07
da cortinico
Ciao,
Ho dato un'occhiata veloce e non ho ben capito come mai utilizzi sia la fork che i pthread, potresti fare tutto con i due processi senza starti ad incasinare ;)
Inoltre ho notato che usi la waitpid, però secondo il manuale, ti mancano gli include di

Codice: Seleziona tutto

#include <sys/types.h>
#include <sys/wait.h>

Re: [C]Problema in lettura con le pipe

Inviato: venerdì 29 maggio 2015, 12:38
da raider91
cortinico [url=http://forum.ubuntu-it.org/viewtopic.php?p=4763200#p4763200][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ciao,
Ho dato un'occhiata veloce e non ho ben capito come mai utilizzi sia la fork che i pthread, potresti fare tutto con i due processi senza starti ad incasinare ;)
Inoltre ho notato che usi la waitpid, però secondo il manuale, ti mancano gli include di

Codice: Seleziona tutto

#include <sys/types.h>
#include <sys/wait.h>
Per quanto riguarda gli include mi sono dimenticato di metterli,grazie! :p
Per il resto lo so che potrei fare tutto solo con la fork ma ho deciso di incasinare un po' la situazione così cerco anche di imparare ad usare i thread.Comunque anche aggiungendo gli header mancanti il problema rimane... :(