linux manpage - inotify Verständnisfrage

Gast #4553992
Lesenswert?
• ▲
▼
Hallo Forum,

ich habe mir gerade die besagte manpage angesehen und eine Frage dazu.
1
for(char_ptr = buf; char_ptr < buf + len; char_ptr += sizeof(struct inotify_event) + event->len){

Den letzten Teil der for-Schleife verstehe ich nicht. Wieso wird hier 
event->len noch addiert?.

Die Schleife soll auf das nächste Event gehen, was im char_buffer durch 
read() abgelegt wird. Die Eventgrösse ist sizeof(struct inotify_event). 
Wieso dann also noch mal event-len dazu addieren?

Weiss das jemand?
Gast #4554009
Lesenswert?
• ▲
▼
Hm, verstehe ich nicht.

event->len ist doch Bestandteil der Struktur inotify->event und gibt die 
Größe des event Namens an.

Ich habe mir die manpage noch einmal angesehen. Von header und payload 
steht da auch nichts.

Wie kommst Du darauf?
Gast #4554032
Lesenswert?
• ▲
▼
Also wenn ich "man inotify" eingebe, steht da:
1
struct inotify_event {
2
   int      wd;       /* Watch descriptor */
3
   uint32_t mask;     /* Mask describing event */
4
   uint32_t cookie;   /* Unique cookie associating related
5
                         events (for rename(2)) */
6
   uint32_t len;      /* Size of name field */
7
   char     name[];   /* Optional null-terminated name */
8
};
Schau die letzten beiden Member an. "len" gibt die Länge von "name" an, 
und "name" hat ja keine feste Größe. Das ist in C so üblich, den letzten 
Member einfach als Array unbestimmter Größe zu schreiben, wenn die Größe 
der Struktur variabel ist.
Gast #4554037
Lesenswert?
• ▲
▼
Ach da ist wohl dein Problem: "sizeof" ist ein Operator, der zur 
Compilezeit (!) die Größe des Datentyps ermittelt, wobei er ein Array 
unbestimmter Größe als 0 rechnet. Somit ermittelt sizeof für diese 
Struktur nur die Summe der Größen der ersten 4 Member. Erst zur Laufzeit 
ist ja die Länge des Arrays bekannt.
Gast #4554175
Lesenswert?
• ▲
▼
nocheinGast schrieb:

>Das ist in C so üblich, den letzten
>Member einfach als Array unbestimmter Größe zu schreiben, wenn die Größe
>der Struktur variabel ist.

Was mich irritiert hat, dass len quasi zwei Mal berücksichtigt wird. 
Einmal innerhalb von sizeof(struct inotify_event), denn len ist ja ein 
Member dieser Struktur und dann noch einmal über event->len.

>Ach da ist wohl dein Problem: "sizeof" ist ein Operator, der zur
>Compilezeit (!) die Größe des Datentyps ermittelt, wobei er ein Array
>unbestimmter Größe als 0 rechnet. Somit ermittelt sizeof für diese
>Struktur nur die Summe der Größen der ersten 4 Member. Erst zur Laufzeit
>ist ja die Länge des Arrays bekannt.

Genau, jetzt hast Du mich verstanden. Danke für die tolle Erklärung!
#4554208
Lesenswert?
• ▲
▼
dd4 schrieb:
> nocheinGast schrieb:
>
>>Das ist in C so üblich, den letzten
>>Member einfach als Array unbestimmter Größe zu schreiben, wenn die Größe
>>der Struktur variabel ist.
>
> Was mich irritiert hat, dass len quasi zwei Mal berücksichtigt wird.
> Einmal innerhalb von sizeof(struct inotify_event), denn len ist ja ein
> Member dieser Struktur und dann noch einmal über event->len.

Da hast du dich geirrt: die Größe des Members len wird beim sizeof 
mitberechnet und danach wird der Inhalt dieses Members draufaddiert. 
Also einmal Speicherbedarf der Variable und einmal der Wert der 
Variable.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren