[C] Problema con Pipe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Beaviss
Prode Principiante
Messaggi: 9
Iscrizione: giovedì 6 novembre 2008, 18:02

[C] Problema con Pipe

Messaggio da Beaviss »

Sto studiando C su linux e ho riscontrato un problema con le pipe.
Ho creato due processi, uno che scrive 3 messaggi sulla pipe e l'altro che li legge tutti poi termina, l'unico problema è che il processo writer funge inviando i 3 messaggi mentre il processo reader legge 3 volte dalla pipe ma l'ultimo messaggio letto è il secondo inviato dal writer, il terzo praticamente non lo legge.
qualcuno sà aiutarmi?

Ecco il codice del reader:

Codice: Seleziona tutto

/*Prende come parametro il nome della pipe*/

#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

main(argc,argv)
int argc;
char *argv[];
{
int pfd_read, nbytes=1;
char bufin[300];

/* crea pipe  e apre in lettura */

if(argc!=2){
	printf("Usage: %s pipe\n", argv[0]);
	exit(1);
	};

if((mknod(argv[1],S_IFIFO | 0666,0) == -1) && (errno != EEXIST)){
	perror("errore mknod:READ");
	exit(1);
	};

if((pfd_read=open(argv[1],O_RDONLY))==-1) {
	perror("errore open:READ");
	exit(1);
	};

while(nbytes != 0){
if((nbytes=read(pfd_read,bufin,60))==-1){
	perror("errore lettura pipe");
	exit(1);
	};
fflush(stdout);
printf("ho letto %s \n");
}

close (pfd_read);

}
Avatar utente
Super Cicco
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1749
Iscrizione: giovedì 16 ottobre 2008, 19:21

Re: [C] Problema con Pipe

Messaggio da Super Cicco »

Beaviss ha scritto: Sto studiando C su linux e ho riscontrato un problema con le pipe.
Ho creato due processi, uno che scrive 3 messaggi sulla pipe e l'altro che li legge tutti poi termina, l'unico problema è che il processo writer funge inviando i 3 messaggi mentre il processo reader legge 3 volte dalla pipe ma l'ultimo messaggio letto è il secondo inviato dal writer, il terzo praticamente non lo legge.
qualcuno sà aiutarmi?

Ecco il codice del reader:

Codice: Seleziona tutto

/*Prende come parametro il nome della pipe*/

#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

main(argc,argv)
int argc;
char *argv[];
{
int pfd_read, nbytes=1;
char bufin[300];

/* crea pipe  e apre in lettura */

if(argc!=2){
	printf("Usage: %s pipe\n", argv[0]);
	exit(1);
	};

if((mknod(argv[1],S_IFIFO | 0666,0) == -1) && (errno != EEXIST)){
	perror("errore mknod:READ");
	exit(1);
	};

if((pfd_read=open(argv[1],O_RDONLY))==-1) {
	perror("errore open:READ");
	exit(1);
	};

while(nbytes != 0){
if((nbytes=read(pfd_read,bufin,60))==-1){
	perror("errore lettura pipe");
	exit(1);
	};
fflush(stdout);
printf("ho letto %s \n");
}

close (pfd_read);

}
non capisco come ti possa stampare il primo e il secondo messaggio dal momento che non passi bufin alla printf:
printf("ho letto %s \n");
dovrebbe essere:
printf("ho letto %s \n", bufin);
quindi o il tuo compilatore C ha sviluppato un'intelligenza artificiale e ha intuito quello che volevi fare :o, o hai postato un codice diverso...

poi quella fflush() la metterei dopo la printf, penso sia questo il motivo per cui non ti stampa l'ultimo messaggio, anche se in effetti è strano perché una printf() terminata da '\n' dovrebbe comunque svuotare il buffer di output se non mi sbaglio  ??? boh

....
exit(1);
};
^ il ";" non ci va!
Ultima modifica di Anonymous il giovedì 19 febbraio 2009, 14:04, modificato 1 volta in totale.
Dai    Prendi  Usa                          ...non chiamatemi Ciccio, è Cicco!
Apri    Esamina  Spingi
Chiudi  Parla    Tira
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1766
Iscrizione: giovedì 4 settembre 2008, 0:27

Re: [C] Problema con Pipe

Messaggio da kelev »

Verissimo .. strano che lo compila senza errori
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
hds619
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 352
Iscrizione: domenica 15 aprile 2007, 20:23
Località: Ferrara
Contatti:

Re: [C] Problema con Pipe

Messaggio da hds619 »

xajx ha scritto: Verissimo .. strano che lo compila senza errori
Beh, nella compilazione non c'è niente di strano dato che printf potrebbe anche non ricevere argomenti.. sta a printf poi richiederli quando incontra %qualcosa.. più che altro in esecuzione non avresti dovuto veder niente.. o ottenere un segmentation fault
Avatar utente
Super Cicco
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1749
Iscrizione: giovedì 16 ottobre 2008, 19:21

Re: [C] Problema con Pipe

Messaggio da Super Cicco »

hds619 ha scritto:
xajx ha scritto: Verissimo .. strano che lo compila senza errori
Beh, nella compilazione non c'è niente di strano dato che printf potrebbe anche non ricevere argomenti.. sta a printf poi richiederli quando incontra %qualcosa.. più che altro in esecuzione non avresti dovuto veder niente.. o ottenere un segmentation fault
è vero, hai perfettamente ragione, il compilatore segnala un warning: too few arguments... solo se si usa l'opzione -Wall
Dai    Prendi  Usa                          ...non chiamatemi Ciccio, è Cicco!
Apri    Esamina  Spingi
Chiudi  Parla    Tira
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti