[Risolto] [C] Utilizzo delle pipe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
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] Utilizzo delle pipe

Messaggio da raider91 »

Ciao ragazzi.Come da titolo sto studiando in C l'utilizzo delle pipe.Ho cercato di scrivere in C un programma abbastanza banale(giusto per capire il funzionamento di una pipe) che facesse comunicare due processi (padre e figlio) mediante una pipe anonima.Non so il perchè ma il programma non funziona bene.In particolare il padre non legge in modo giusto l'array modificato dal figlio.Non riesco a trovare l'errore per questo chiedo il vostro aiuto.Questo è il codice:

Codice: Seleziona tutto


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

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

int array[]={10,11,12,32,33}; //Array di input;
int fd[2],i,nread;
pid_t pid;
int buffer[5]; //Buffer che dovrà contenere i valori modificati dell'array;
int status;

printf("\nSono il processo padre e ho pid %d\n",getpid());
printf("\nStampo il valore dell'array inizializzato da me!!!!!\n");

for(i=0;i<5;i++)
   printf("\nCella %d------>%d\n",i,array[i]);

pipe(fd);
pid=fork();

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

          if(pid==0){
                                   close(fd[READ]);
                          printf("\nSono il processo figlio di %d e ho pid %d\n",getppid(),getpid());
                          printf("\nDetermino i nuovi valori dell'array!!!\n");
                                   for(i=0;i<5;i++){
                                      buffer[i]=i+5;
                                     printf("\nCella %d-------->%d\n",i,buffer[i]);}
                                write(fd[WRITE],buffer,5);
                              close(fd[WRITE]);

             }
                 else{
                             //Processo padre;
                                 close(fd[WRITE]);
                          nread=read(fd[READ],buffer,5);
                         printf("\nIl valore dell'array modificato da mio figlio e':\n");
                           for(i=0;i<5;i++){
                                  array[i]=buffer[i];
                              printf("\nCella %d---->%d\n",i,array[i]);}
                                  waitpid(pid,&status,0);
                            close(fd[READ]);
                                }

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

    return 0;
}


Ultima modifica di raider91 il giovedì 7 maggio 2015, 13:25, 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] Utilizzo delle pipe

Messaggio da Actarus5 »

Ho dato un'occhiata e sembra che il problema fosse nelle chiamate alle funzioni read e write. Non devi mettere il numero di elementi, ma il numero di byte!
Così dovrebbe andare comunque:

Codice: Seleziona tutto

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

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

	int array[] = { 10, 11, 12, 32, 33 }; //Array di input;
	int fd[2], i, nread;
	pid_t pid;
	int buffer[5]; //Buffer che dovrà contenere i valori modificati dell'array;
	int status;

	printf("\nSono il processo padre e ho pid %d\n", getpid());
	printf("\nStampo il valore dell'array inizializzato da me!!!!!\n");

	for (i = 0; i < 5; i++)
		printf("\nCella %d------>%d\n", i, array[i]);

	pipe(fd);
	pid = fork();

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

	if (pid == 0)
	{
		close(fd[READ]);
		printf("\nSono il processo figlio di %d e ho pid %d\n", getppid(),
				getpid());
		printf("\nDetermino i nuovi valori dell'array!!!\n");
		for (i = 0; i < 5; i++)
		{
			buffer[i] = i + 5;
			printf("\nCella %d-------->%d\n", i, buffer[i]);
		}
	write(fd[WRITE], buffer, sizeof(buffer));
	close(fd[WRITE]);

	}
	else
	{
		//Processo padre;
		close(fd[WRITE]);
		nread = read(fd[READ], buffer, sizeof(buffer));
		printf("\nIl valore dell'array modificato da mio figlio e':\n");
		for (i = 0; i < 5; i++)
		{
			array[i] = buffer[i];
			printf("\nCella %d---->%d\n", i, array[i]);
		}
		waitpid(pid, &status, 0);
		close(fd[READ]);
	}

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

	return 0;
}
P.s Hai anche 2 warning, devi includere sys/wait.h e praticamente non usi mai la variabile nread
"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] Utilizzo delle pipe

Messaggio da raider91 »

Ok ora va alla grande...grazie! :D
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] Utilizzo delle pipe

Messaggio da vbextreme »

@Actarus5, essendo sizeof un operatore va usato come tale quando non è riferito ad un tipo ma ad un nome di variabile, pertanto la dicitura corretta è:

Codice: Seleziona tutto

read/write(fd, buffer, sizeof buffer);
anche se penso sia da preferire:

Codice: Seleziona tutto

read/write(fd, buffer, sizeof(int) * countbuffer);
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] Utilizzo delle pipe

Messaggio da Actarus5 »

vbextreme [url=http://forum.ubuntu-it.org/viewtopic.php?p=4755089#p4755089][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:@Actarus5, essendo sizeof un operatore va usato come tale quando non è riferito ad un tipo ma ad un nome di variabile, pertanto la dicitura corretta è:

Codice: Seleziona tutto

read/write(fd, buffer, sizeof buffer);
anche se penso sia da preferire:

Codice: Seleziona tutto

read/write(fd, buffer, sizeof(int) * countbuffer);
Non so se sia da preferire la seconda però mi è capitato di vedere indifferentemente sia sizeof variabile che sizeof(variabile), anche se so che le parentesi non sono obbligatorie visto che è un operatore... A dire il vero non è una questione che ho ben capito e gcc non mi aiuta perché per lui è indifferente
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
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] Utilizzo delle pipe

Messaggio da vbextreme »

quando usi il nome delle variabili si usa a mo di operatore, per i tipi a mo di funzione.
Non solo GCC si comporta cosi, ma penso che usare il metodo corretto sia sempre meglio.

Rimane da preferire la forma 'lunga'!
Easy framework per il linguaggio C.
vbextreme hack your life
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti