Aufgabe 5 (crawl): Problem mit off_t und atoi

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 5 (crawl): Problem mit off_t und atoi
Ich will den Wert des Arguments -size[±]=SIZE mit atoi() parsen, hab da aber ein Problem: Die Größe von off_t ist nicht eindeutig festgelegt. Ich weiß noch nicht einmal, ob off_t signed oder unsigned ist. Auf dem faui01 ist off_t 4 Byte groß (wie ein int), das reicht doch nicht ansatzweise, um große Dateien (>2GiB oder 4GiB) zu beschreiben. Ist st_size überhaupt die richtige Größe, um die Dateigröße auszulesen?
Muss die Größe eines off_t nicht vom Dateisystem abhängen?
So lange die Größe von off_t nicht festgelegt ist, weiß ich aber nicht, ob ich atoi(3), atol(3) oder atoll(3) verwenden soll bzw. welche Größe ich ausschließen muss, weil mein crawl sie sowieso nicht verarbeiten kann.

Ich könnte ein bisschen Makro-Gefrickel machen um die benötigten Werte zur Compilezeit zu bestimmen, aber das ist wahrscheinlich nicht im Sinne der Aufgabenstellung.


Richtig. Die exakte Größe ist nicht spezifiziert, aber [m]off_t[/m] ist [m]signed[/m]:

{1}: <sys/types.h>

Ja, [m]st_size[/m] ist die Dateigröße. Falls [m]off_t[/m] 4 Byte groß ist, kannst du keine Dateien > 2GiB beschreiben. Mit dem Befehl [m]getconf LFS_CFLAGS[/m] (und [m]LFS_LDFLAGS[/m], [m]LFS_LIBS[/m]) bekommst du die nötigen Flags um größere Dateien zu unterstützen (Large File Support, Details siehe {2} und {3}). Auf der faui01 sind das [m]-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64[/m], damit ist ein [m]off_t[/m] dann auch 8 Byte groß und es werden größere Dateien unterstützt.

{2}: http://www.unix.org/version2/whatsnew/lfs20mar.html
{3}: http://users.suse.com/~aj/linux_lfs.html

Jein. Das kommt vor allem auf die Schnittstelle der C-Library und des Betriebssystems an. Diese müssen große Offsets/Dateigrößen unterstützen. Erst wenn das gegeben ist, kann das Dateisystem größere Dateien unterstützen.

Für die Aufgabe kannst du dir eine [m]ato*(3)[/m]-Funktion aussuchen. [m]atol(3)[/m] funktioniert am besten, weil auf x86 ein [m]long[/m] 4 Byte groß ist und auf x64 8 Byte (passt also solange kein Large File Support für x86 genutzt wird). Aber das gilt nicht allgemein.

Wenn du es korrekt machen willst, müsstest du je nach Größe von [m]off_t[/m] (und [m]int[/m], [m]long[/m]) die passende Funktion auswählen. Oder davon ausgehen, dass ein [m]long[/m] groß genug ist und abhängig von der Größe von [m]off_t[/m] zu große Ergebnisse von [m]atol(3)[/m] mit einem Fehler abfangen.