Newsgroup: it.comp.lang.c
Titolo: problemino semplice con le pipe...

buon giorno a tutti!
sto imparando ad usare questa fantastica cosa della comunicazione tra
processi. Il codice qui sotto funziona ma mi da' un output troncandomi
l'ultima lettera... E NON SO PERCHE'!! piu che altro e' una questione di
principio!!
Sono semplicemente 2 processi, uno scrive e l'altro legge su una pipe.
Chi ha un po di tempo potrebbe gentilmente darci un'occhiata?
Grazie a tutti!!
Matteo
int main() {
	int n, pid, pipefd[2];
	char buff[50];
	if ((pipe(pipefd)) < 0) {
		printf("errore pipe\n");
		exit(2);
	}
 
	if ((pid = fork()) < 0) {
		printf("errore fork\n");
		exit(1);
	}
	if (pid != 0) {
		close(pipefd[1]);
		wait();
		if ((n = read(pipefd[0], buff, strlen(buff))) <= 0) {
			printf("errore di lettura pipe\n");
			exit(3);
		}
 
		printf("io sono il genitore di %d che mi ha mandato %s\n", pid, buff);
		exit(0);
	} else if (pid == 0) {
		close(pipefd[0]);
		if ((n = write(pipefd[1], "focca la bindella", 18)) != 18) {
			printf("errore scrittura pipe\n");
			exit(4);
		}
		printf("%d\n", n);
		printf("sono %d, il figlio di %d e gli ho appena inviato qualcosa...
chissa' se lo riceve...\n", getpid(), getppid());
		exit(0);
	}
	return 0;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 if ((n = read(pipefd[0], buff, strlen(buff))) <= 0) {
                           ^^^^^^^^^^Ecco la magagna.
Volevi scrivere sizeof(buff), per caso? Se hai usato strlen 
intenzionalmente, devi sapere che `buf' è un array locale automatico 
(*non* statico) quindi non viene inizializzato e può contenere 
qualsiasi cosa, ad esempio uno zero nel mezzo, che corrisponde al 
'\0' al quale strlen si ferma escludendolo dal conteggio. Altro che 
ultima lettera, sei stato fortunato che non si prendeva un SIGSEGV! 
[...]
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.

Caspita... hai le idee chiare... ti ringrazio molto per la risposta
concisa e completa!!
Grazie mille, ho imparato qualcosa di nuovo!!
Matteo
P.S. le include non le ho scritte per non ci sono, tutto qui.


 P.S. le include non le ho scritte per non ci sono, tutto qui.
Ci vanno, ci vanno; è gcc che ti evita di metterle, ma se cambi 
compilatore? Che fai, rattoppi tutti i tuoi progs? Ad esempio, prova 
a compilare il codice senza le #include con g++.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
Ciao


 #include <stdio.h>
se incomincia a provare a compilare con le opzioni:
-W -Wall -pedantic
vedi che poi capisce cosa deve mettere bene in un programma ... (cmq con
quelle opzioni occhio a non correggere cose strane negli header che
andrebbero tenuti sempre standard, al massimo quando non ti segnala piu'
errori all'interno dei tuoi file levi le opzioni e compili normalmente)
ciao

 compili normalmente)
Da "cmq" in giů non ho capito piů nulla.
Cosa strane? Cosa c'č di piů strano dell'usare la libreria standard 
senza includerla??
Saluti


 senza includerla??
alcune librerie come la math glut ed altre hanno definizioni ed opzioni che
fanno a pugni con quelle opzioni che ti segnalano tutti i warning ecc ... e
l'opzione pedantic anche se c'e' un warning non ti lascia terminare la
compilazione, quindi quando non hai piu' warning ed errori nel tuo codice
fai meglio a levare tali opzioni che magari rivelano errori in headerfile
che a te importano poco, cosi' facendo porti a termine la compilazione
ottieni il tuo eseguibile senza warning ...
ho spiegato meglio ora ???
ciao

 ho spiegato meglio ora ???
Chiarissimo. :)
Ciao e grazie
