Forum: PC-Programmierung linux manpage - inotify Verständnisfrage


von dd4 (Gast)


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?

von nocheinGast (Gast)


Lesenswert?

Weil "struct inotify_event" nur den Header beinhaltet, und danach noch 
len Bytes an Nutzdaten kommen.

von dd4 (Gast)


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?

von dd4 (Gast)


Lesenswert?

errata:

>Struktur inotify->event

Struktur inotify_event

von nocheinGast (Gast)


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.

von nocheinGast (Gast)


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.

von dd4 (Gast)


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!

von Ralf D. (doeblitz)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.