Fragen? Antworten! Siehe auch: Alternativlos
write() und writev() haben ein Limit von 2GB, wieviel sie auf einmal schreiben.
Wir haben hier 64-bit-Systeme. Man kann viel größere Dateien in den Speicher mappen. Wenn ich eine Datei kopieren will, dann mappe ich die Quelldatei in den Speicher und erwarte, mit einem write(zieldatei, memorymapping, quelldateigroesse) alle Daten in die Zieldatei schreiben zu können.
Das funktioniert auch, außer die Zieldatei ist 2 GB oder größer.
Warum ist das so? Weil die Codequalität der Treiber unter aller Sau ist. Linus hatte nach ein paar Monaten keinen Bock mehr, denen hinterherzuwischen, und hat dann einfach gesagt: Mehr als 2GB auf einmal darf man dann halt nicht schreiben.
Habe ich auf menschlicher Ebene Verständnis für, aber es entspricht nicht meinem Verständnis von Softwarequalität und an Anspruch an sich selbst als Softwareingenieur. Das ist wie wenn die Bundesregierung anstatt marode Autobahnen zu reparieren einfach Geschwindigkeitsbegrenzungsschilder aufstellt.
Oh, warte ...
Das Problem ist nicht Linux-spezifisch. Unter Windows ist es noch lustiger, da hat das WriteFile-API als Typ für die Anzahl der zu schreibenden Bytes bloß ein DWORD, das ist auch auf 64-bit Systemen 32-bit breit. Völlig absurd.
Die ganze Problematik blubbert hier gerade hoch, weil ich unter FreeBSD gegen ein Limit in writev gelaufen bin. Stellt sich raus: writev unter FreeBSD macht erstmal im Kernel eine Kopie aller zu schreibenden Daten, nicht nur des Vektors, auch der darin verlinkten Daten. Und weil das halt scheiße ineffizient ist, haben sie da ein Limit drin.
Ich muss bei sowas immer an Bill Gates und seine 640 KB denken.