nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Re: inotify e lettura di strutture dati da file descriptor

X-FaceVon: Gian Uberto Lauri (saint@spammer.impiccati.it) [Profil]
Datum: 26.01.2008 11:43
Message-ID: <8763xgj299.fsf@cyrano.gianoziaorientale.it>
Newsgroup: it.comp.os.linux.development
>>>>> Long count = 12.19.15.0.9; tzolkin = 7 Muluc; haab = 17 Muan.
>>>>> I get words from the Allmighty Great Gnus that
>>>>> "VD" == Vito DeTullio <Vito.DeTullio@gmail.com>
writes:

VD> struct inotify_event {
VD>     int      wd;       /* Watch descriptor */
VD>     uint32_t mask;     /* Mask of events */
VD>     uint32_t cookie;   /* Unique cookie associating related
VD>                           events (for rename(2)) */
VD>     uint32_t len;      /* Size of 'name' field */
VD>     char     name[];   /* Optional null-terminated name */
VD> };

VD> come si può vedere l'ultimo campo è a dimensione variabile
(tant'è
VD> che "len" è lì proprio a questo scopo).

VD> Io, con la read, vorrei poter leggere "direttamente" dal fd, e
VD> scrivere "direttamente" in una variabile di tipo struct
VD> inotify_event, solo che la dimensione della struttura la devo
VD> calcolare al volo (in man inotify stessso leggo che la dimensione di
VD> un evento è size(struct inotify_event) + evento->len), e non so come
VD> fare, visto che è contenuta nella struttura stessa, e quindi non so
VD> che parametro passare a malloc() per poter allocare lo spazio
VD> "giusto" per il dato che mi viene dal file!

Hmmm...

Se la mia conoscenza del C non mi tradisce ( K&R forever :)!!! ), name è
un puntarore, ovvero in memoria non hai una cosa del tipo:

(leggere con font fixed e senza riformattazioni - DEADBEEF è un valore a
32 bit che a noi non interessa)

campo :[   wd   ][  mask  ][ cookie ][  len   ][         name          ]
valore: DEADBEEF  DEADBEEF  DEADBEEF     23    [IoSonoIlNomeDell'Evento]

ma

campo :[   wd   ][  mask  ][ cookie ][  len   ][  name  ]
valore: DEADBEEF  DEADBEEF  DEADBEEF     23     *pointer

ed altrove nella memoria (alla locazione *pointer)

[IoSonoIlNomeDell'Evento]

Quindi tu allochi un inotify_event  e leggi quello, poi vedi quanto vale
len e  allochi len+1*sizeof(char) byte  per il nome  (+ 1 perché  è null
terminated ed  il sizeof(char)  perché non capita,  ma se char  non vale
1... :) )

Sperando di non aver detto vaccate... Ma non dovrei.

--
/\           ___                                    Ubuntu: ancient
/___/\_|_|\_|__|___Gian Uberto Lauri_____               African word
//--\| | \|  |   Integralista GNUslamico            meaning "I can
\/                   e coltivatore diretto               not install
di software                   Debian"

a Cesare avrei detto di scrivermi | I would have told Caesar to write
a fnvag@rat.vg                    | me at fnvag@rat.vg

[ Auf dieses Posting antworten ]

Antworten