[Risolto][C] Problema con le pipe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

[Risolto][C] Problema con le pipe

Messaggio da raider91 »

Ciao ragazzi.Sto continuando ad esercitarmi con le pipe anonime e ho scritto un nuovo codice che però ahimè non funziona come dovrebbe.Mi aiutate a trovare l'errore?

Codice: Seleziona tutto


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<time.h>
#define WRITE 0
#define READ 1

int main(int argc,char* argv[]){

srand((int)time(NULL));

int status,i,n=0,size=0,nread;
int* array; //array per i dati di input;
int* buffer; //array che contiene i dati modificati;
int fd[2];
pid_t pid;

    do{
         size=1+rand()%10;
                }while(size<5);

array=(int*)calloc(size,sizeof(int));
buffer=(int*)calloc(size,sizeof(int));

 printf("\nSono il processo padre e ho pid %d\nInizializzo l'array!!!",getpid());
     for(i=0;i<size;i++){
            n=1+rand()%10;
              array[i]=n;
          printf("\nCella %d---->%d\n",i,array[i]);
                 }

pipe(fd); 
pid=fork();

          if(pid<0){
                fprintf(stderr,"\nErrore %d nella fork!\n",errno);
                    exit(-1);
            }

       if(pid>0){
              close(fd[READ]);
                 printf("\nSono il processo padre e modifico l'array di input!\n");
             for(i=0;i<size;i++){
                  buffer[i]=array[i]+4;
                    printf("\nCella %d----->%d\n",i,buffer[i]);
                 }
                    write(fd[WRITE],buffer,sizeof(buffer));
                      waitpid(pid,&status,0);
                   close(fd[WRITE]);
}

         else{
                 close(fd[WRITE]);
                     printf("\nSono il processo figlio di %d e ho pid %d\nLeggo l'array modificato da mio padre!",getppid(),getpid());
                   nread=read(fd[READ],buffer,sizeof(buffer));
                           for(i=0;i<size;i++)
                             printf("\nCella %d------>%d\n",i,buffer[i]);
                       close(fd[READ]);
                }

printf("\nHa terminato il processo %d\n",getpid());

        return 0;
}

Ultima modifica di raider91 il venerdì 8 maggio 2015, 12:27, modificato 1 volta in totale.
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: [C] Problema con le pipe

Messaggio da Actarus5 »

Mi sa che hai invertito i define:

Codice: Seleziona tutto

#define READ 0
#define WRITE 1
Per quanto riguarda il resto invece il problema deriva dal sizeof(buffer): in questo caso buffer è un puntatore e quindi il compilatore non sa a cosa punta, quindi in pratica non passi a read/write il giusto numero di byte.
Tuttavia puoi ottenerlo comunque perché hai la variabile size e sai che per te buffer è un array di interi, in pratica fai qualcosa del genere:

Codice: Seleziona tutto

write(fd[WRITE], buffer, size*sizeof(int));
...
nread = read(fd[READ], buffer, size*sizeof(int));
Inoltre controlla sempre il valore di ritorno delle funzioni che allocano memoria e ricordati di liberare la memoria con free() appena quel blocco non ti serve più.
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: [C] Problema con le pipe

Messaggio da raider91 »

Actarus5 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4755240#p4755240][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Mi sa che hai invertito i define:

Codice: Seleziona tutto

#define READ 0
#define WRITE 1
Per quanto riguarda il resto invece il problema deriva dal sizeof(buffer): in questo caso buffer è un puntatore e quindi il compilatore non sa a cosa punta, quindi in pratica non passi a read/write il giusto numero di byte.
Tuttavia puoi ottenerlo comunque perché hai la variabile size e sai che per te buffer è un array di interi, in pratica fai qualcosa del genere:

Codice: Seleziona tutto

write(fd[WRITE], buffer, size*sizeof(int));
...
nread = read(fd[READ], buffer, size*sizeof(int));
Inoltre controlla sempre il valore di ritorno delle funzioni che allocano memoria e ricordati di liberare la memoria con free() appena quel blocco non ti serve più.
Per quanto riguarda i define penso che la scelta sia arbitraria.Cioè è indifferente se setto la lettura a 0 oppure ad 1.Per quanto riguarda il problema riguardante il sizeof(buffer) ho corretto come mi hai suggerito quindi facendo size*sizeof(buffer) però il risultato non cambia infatti l'output del programma risulta essere sempre lo stesso di prima.Quindi non riesco proprio a capire quale sia il problema :muro: ...per quanto riguarda la free mi ero dimenticato di liberare lo spazio allocato :p
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: [C] Problema con le pipe

Messaggio da Actarus5 »

Compilando questo (ometto le correzioni sull'allocazione dinamica perché vado di corsa ma non dimenticartele):

Codice: Seleziona tutto

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<time.h>
#define READ 0
#define WRITE 1

int main(int argc, char* argv[]) {

	int status, i, n = 0, size = 0, nread;
	int* array; //array per i dati di input;
	int* buffer; //array che contiene i dati modificati;
	int fd[2];
	pid_t pid;
	srand((int) time(NULL));

	do {
		size = 1 + rand() % 10;
	} while (size < 5);

	array = (int*) calloc(size, sizeof(int));
	buffer = (int*) calloc(size, sizeof(int));

	printf("Sono il processo padre e ho pid %d\n"
			"Inizializzo l'array!!!\n",
			getpid());
	for (i = 0; i < size; i++) {
		n = 1 + rand() % 10;
		array[i] = n;
		printf("\nCella %d---->%d\n", i, array[i]);
	}

	pipe(fd);
	pid = fork();

	if (pid < 0) {
		fprintf(stderr, "Errore %d nella fork!\n", errno);
		exit(-1);
	}

	if (pid > 0) {
		close(fd[READ]);
		printf("\nSono il processo padre e modifico l'array di input!\n");
		for (i = 0; i < size; i++) {
			buffer[i] = array[i] + 4;
			printf("\nCella %d----->%d\n", i, buffer[i]);
		}
		write(fd[WRITE], buffer, size*sizeof(int));
		waitpid(pid, &status, 0);
		close(fd[WRITE]);
	}

	else {
		close(fd[WRITE]);
		printf("\nSono il processo figlio di %d e ho pid %d\n"
				"Leggo l'array modificato da mio padre!\n",
				getppid(), getpid());
		nread = read(fd[READ], buffer, size*sizeof(int));
		for (i = 0; i < size; i++)
			printf("\nCella %d------>%d\n", i, buffer[i]);
		close(fd[READ]);
	}

	printf("\nHa terminato il processo %d\n", getpid());

	return 0;
}
ottengo:

Codice: Seleziona tutto

Sono il processo padre e ho pid 9705
Inizializzo l'array!!!

Cella 0---->4

Cella 1---->5

Cella 2---->1

Cella 3---->1

Cella 4---->10

Cella 5---->10

Cella 6---->6

Sono il processo padre e modifico l'array di input!

Cella 0----->8

Cella 1----->9

Cella 2----->5

Cella 3----->5

Cella 4----->14

Cella 5----->14

Cella 6----->10

Sono il processo figlio di 9705 e ho pid 9710
Leggo l'array modificato da mio padre!

Cella 0------>8

Cella 1------>9

Cella 2------>5

Cella 3------>5

Cella 4------>14

Cella 5------>14

Cella 6------>10

Ha terminato il processo 9710

Ha terminato il processo 9705
Credo che fd[0] sia il file descriptor utilizzabile per la lettura ed fd[1] per la scrittura, non dovrebbe essere una cosa arbitraria
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: [C] Problema con le pipe

Messaggio da raider91 »

Non riesco a capire davvero sta cosa.Ho modificato il codice in modo corretto infatti risulta identico al tuo però l'output è il seguente:

Codice: Seleziona tutto

Sono il processo padre e ho pid 3128
Inizializzo l'array!!!
Cella 0---->10

Cella 1---->3

Cella 2---->4

Cella 3---->10

Cella 4---->5

Cella 5---->1

Cella 6---->7

Sono il processo padre e modifico l'array di input!

Cella 0----->14

Cella 1----->7

Cella 2----->8

Cella 3----->14

Cella 4----->9

Cella 5----->5

Cella 6----->11

Sono il processo figlio di 3128 e ho pid 3129
Leggo l'array modificato da mio padre!
Cella 0------>0

Cella 1------>0

Cella 2------>0

Cella 3------>0

Cella 4------>0

Cella 5------>0

Cella 6------>0

Ha terminato il processo 3129

Ha terminato il processo 3128

Premetto che sto compilando ed eseguendo da terminale...
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: [C] Problema con le pipe

Messaggio da Actarus5 »

Hai sistemato anche i define?
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: [C] Problema con le pipe

Messaggio da raider91 »

Sistemando i define funziona correttamente.Ma scusa non avrebbe dovuto funzionarmi lo stesso correttamente anche con i settaggi che avevo dato io per i define?Cioè non è a mia discrezione se settare la lettura a 1 invece che a 0?
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: [C] Problema con le pipe

Messaggio da Actarus5 »

Nono, puoi anche vederlo col comando man pipe forse, è scritto anche lì :)

" pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write"
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: [C] Problema con le pipe

Messaggio da raider91 »

Actarus5 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4755405#p4755405][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Nono, puoi anche vederlo col comando man pipe forse, è scritto anche lì :)

" pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write"
Ah ho capito,questo non lo sapevo.Grazie! :birra:
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [Risolto][C] Problema con le pipe

Messaggio da vbextreme »

posso fare il quatrocchi della situazione e dirvi "te l'avevo detto io..."
usate
"sizeof(<tipo>) * dimensione"
"che è meglio!!"
Easy framework per il linguaggio C.
vbextreme hack your life
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: [Risolto][C] Problema con le pipe

Messaggio da Actarus5 »

vbextreme [url=http://forum.ubuntu-it.org/viewtopic.php?p=4755651#p4755651][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:posso fare il quatrocchi della situazione e dirvi "te l'avevo detto io..."
usate
"sizeof(<tipo>) * dimensione"
"che è meglio!!"
:lol:

Ci starebbe tutto :sisi:
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti