-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Monday 25 March 2002 17:28, Eric Schaefer wrote:
Hat jemand hier extensiv mit pipes rumgemacht?
Ja. Und auch schon recht interessante Entdeckungen gemacht.
Beispiel: auf HP/UX verlieren Pipes, die zuviel Daten zu schnell transferieren sollen ab und zu einige Bytes. AF_LOCAL Sockets sind zuverlaessiger (man 2 socketpair).
Folgendes Problem (?): Ich muß zwischen einigen Prozessen strukturierte Daten austauschen und wüßte gern, ob es dafür eine "übliche" Vorgehensweise über pipes gibt.
Im Moment XML. Vorher ASCII. Weil halt Kompatibel (was bei lokalen Verbindungen aber wirklich keinen Sinn macht). Manchmal CORBA/DCOP/DCOM/etc.pp.
Pragmatiker nehmen serialisierte Binaerdaten irgendeiner Form.
Mein Gedanke war, daß man erst eine Art ID in die pipe steckt, die bestimmt, was für Daten kommen werden, danach eine Längenangabe und erst dann die Daten.
Klingt gut, ich haette die Laenge aber als erstes genommen, weil man dann ID und Daten auf einen Rutsch einlesen kann:
char buf[MAXTYPELEN+4]; int len,*id=(int*)buf; struct irgendwas *iwas=buf+sizeof(int); struct sonstwas *swas=buf+sizeof(int); read(fd,&len,sizeof(len)); read(fd,buf,len+sizeof(int)); switch(*id){ case IRGENDWAS: /*tu was mit *iwas */ break; /*...*/ }
Du siehst, eine Menge Casterei und wenig Speicherverbrauch...
...und zu wenig Kommentare: *id wird immer auf die ersten 4 Byte des Puffers zeigen, wo es auch geliefert wird *iwas und *swas zeigen immer auf den Anfang der Daten.
Eine andere Moeglichkeit waere ID und Laenge gemeinsam in eine struct{int id,len}; einzulesen und dann entweder a) fuer jede moegliche ID eine extra struct anlegen und lesen oder b) alle structs in einer union halten und nur ein read ausprogrammieren: union { struct irgendwas iwas; struct sonstwas swas; } alles; /*...*/ read(fd,&alles,len);
Hat überhaupt jemand kapiert, was ich mit diesem konfusen Text fragen will?
Ja, hast Du meine Antwort verstanden? ;-)
Konrad
- -- BOFH excuse #88:
Boss' kid fucked up the machine