|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
pipe...cosa e quanto si può trasferire ad un figlio?
ragazzi.....premettendo che sto uscendo pazzo co sto sistemi operativi....sapete come funziona bene una pipe??
cioè posso trasferire interi? posso trasferire più di un inf? se si mi aiutate facendo qualche esempio...ve ne sarei grato!!!
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Beh, puoi trasferire tutto quello che vuoi anche struttture dati piuttosto complesse....sta a te pero' dirgli che stai scrivendo tot byte. In ogni caso il terzo argomento di solito e' un bel sizeof(struttura_dati_che_contiene_cio_che_le_vuoi mandare).
Se ben ricordo cmq hanno una loro dimensione...ovvero, hanno un buffer definito.....PIPE_BUF mi pare. Nel caso tu voglia trasferire piu' byte di PIPE_BUF non hai piu' garanzie di atomicita' nella read e nella write. Cya! |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Re: pipe...cosa e quanto si può trasferire ad un figlio?
Quote:
Due semplici e banali esempi; Codice:
se so che devo ricevere dalla pipe un intero:
...
int number;
read(fd0, &number, sizeof(int));
printf("Intero ricevuto: %d\n", *number);
...
se so che devo ricevere una stringa lunga non piu' di 100 byte:
...
int readed;
char * buffer = malloc(sizeof(char) * 100 +1);
readed = read(fd0, buffer, 100);
buffer[readed] = '\0';/*Aggiungo esplicitamente il carattere di terminazione alla stringa*/
printf("Stringa ricevuta: %s\n", buffer);
...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
ricorda che le pipe anonime, solitamente, hanno dimensione fino a 5 K, mentre le FIFO (pipe con nome) hanno dimensione max fino a 40 K....
__________________
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
la mia situazione è questa:
il processo padre deve mandare tramite una pipe un intero al figlio p1, vado a fare la write, quando ci passo un carattere tutto bene (facccio poi io la conversione) ma un intero niente...mi esce un numero tutto sballato! faccio cosi, /*padre*/ close(fd[0]); write(fd[1],2,1) //* ho provato anche con una variabile /*poi nel figlio*/ close(fd[1]); read(fd[0],&temp,1); poi un altra domanda...come faccio a passargli due interi....faccio un write e poi ne faccio un altro.....come posso fare?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
come non detto dovevo mettere il sizeof!!
ah un altra cosa...scusate sono proprio un rompiballe ma domani ho il laboratorio(ESAMEE).... posso scrivere un intero in un file...? cioè con le funzioni read e write sul man ho trovato che posso passare char *buf...altrimenti so cazzi......devo fare la conversione?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ragazzi io ho provato a trasmettere una struttura attraverso una pipe ma mi dà errore in fase di compilazione.
Codice:
typedef struct messaggio {
int direzione;
char c;
} msg;
...
msg nuovo_msg;
nuovo_msg.direzione=OE;
nuovo_msg.c='s';
write (pipe, nuovo_msg, sizeof(msg));
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
gaurda che devi scrivere nella parte della pipe in cui è prevista la scrittura...ovvero
se definisci int fd[2] pipe(fd) fd[0] sarà la parte in lettura ed fd[1] la parte in scrittura ogni volta prima di scrivere devi chiudere la parte che non ti serve e poi utilizzare il write: close(fd[0]); write(fd[1],"scrivonellepipe",15); prova un pò!
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Potresti trasformare l'int in una coppia di char... se non ricordo male, il char ha le dimensioni di un byte, mentre l'int (di solito) di 2... e a volte di 4, dipende dalla macchina e dal Sistema Operativo.
Sotto queste ipotesi, forse questo funziona: /* Prima il MSB, poi il LSB */ int i=... ... char a=(char)((i - (i % 256)) \ 256); char b=(char)(i % 256); E poi scrivi prima a e poi b sul file; quando li leggi, ripeti le operazioni al contrario. Spero che funzioni...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
ma nessuno mi sa dire se posso scrivere due volte su una stessa pipe e leggere due volte da un altro processo.....cioè che faccio la apro la chiudo e la riapro...che posso fa?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
Codice:
int miapipe[2];
if (pipe(miapipe)) printf("ERRORE");
close(miapipe[INPUT]);
write(miapipe.....)
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
write (pipe, nuovo_msg, sizeof(msg));
prova con write (pipe, &nuovo_msg, sizeof(msg)); ma sicuro che si mette sizeof(msg) ? non si mette sizeof(messaggio)?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Quote:
Esatto, alla write devi passare un puntatore -> quindi un indirizzo. E' corretto anche sizeof(msg). Nel caso nuovo_msg fosse stato un puntatore allora no, il sizeof ritorna la dimensione del puntatore che e' 4byte. Potresti pero' fare un sizeof(*nuovo_msg). EDIT: Avevo cannato a scrivere Ultima modifica di Dun : 05-07-2004 alle 01:10. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Quote:
write(miapipe, &nuovo_msg, sizeof(msg)); Prova...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Quote:
Magari si potrebbe fare, supposto msg un tipo puntatore: Codice:
msg myP; ... ... write(..., myP, sizeof(*myP)); ...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Quote:
Ci sono due casi: 1) Dichiari la struttura dati nello stack: msg myP In questo caso allora: nella write utilizzi &myP e come sizeof invece sizeof(myP) oppure sizeof(msg) 2) Dichiari la struttura nello heap attraverso un ptr e la allochi tramite malloc: msg *myP; myP = (msg *) malloc(sizeof(msg)); Qua invece nella write utilizzi myP e come sizeof, sizeof(*myP) oppure sizeof(msg); In effetti anche a me non tornava l' utilizzo del sizeof passandogli la dereferenziazione del puntatore ma l'ho appena provata sotto gcc 3.3.4 con flag -Wall quindi dovrebbe andare Ultima modifica di Dun : 05-07-2004 alle 01:11. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9473
|
Mmm... dubbio derivante da memoria corta e sonno sovrastante...
Codice:
/*Se ho una struttura siffatta:*/
struct myS{
char * a;
char * b;
int num;
}
/*dichiaro due variabili:*/
struct myS first;
struct myS second;
/*Inizializzo i campi di first*/
first.a = "NeutralMilkHotel";
first.b = "InTheAeroplaneOverTheSea";
first.num = 1998;
/*Adesso quelli di second*/
second.a = "MC5";
second.b = "Tonight";
second.num = 1970;
/*Facendo poi:*/
int L1 = sizeof(struct myS);
int L2 = sizeof(first);
int L3 = sizeof(second);
thks
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:58.


















