Warum hinterlässt das Schreiben kontinuierlich 4 KB im Puffer?

Lesezeit: 2 Minuten

Ich habe im Wesentlichen folgenden Code:

int fileWrite(int file, void * pBuffer, size_t size)
{
    size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
    if (bytesWritten != size)
    {
       return -1;
    }
    return 0;
}

Es funktioniert, wenn die Größe 1 GB beträgt, aber wenn die Größe ~ 2 GB beträgt, bleiben konsistent 4 KB übrig. Ich kann dies beheben, indem ich Write in eine Schleife einschließe und den Puffer nach oben verschiebe, aber ich bin neugierig, warum es immer fehlschlägt.

Wenn die Größe beispielsweise 2147483648 ist, schreibt Write nur 2147479552 und lässt 4096 ungeschrieben. Warum sollte das passieren und ist es richtig, schreiben immer in eine Schleife zu packen?

  • Läuft es im 32-Bit-Modus? 2gig ist die maximale 32-Bit-Zahl.

    – Barmar

    10. April 2020 um 18:51 Uhr

  • Die Regeln für wie viele Daten write auf einmal verbrauchen, hängt davon ab, welche Art von Datensenke file ist (zB “normale” Datei, Pipe, Stream-Socket, Datagramm-Socket, …). Kannst du genauer sein?

    – zol

    10. April 2020 um 18:52 Uhr


  • Warte, versuchst du es write die ganze Datei auf einmal? Der übliche Ansatz besteht darin, die Daten jeweils um eine Puffergröße zu streamen, bis Sie alles geschrieben haben.

    – Luan

    11. April 2020 um 7:10 Uhr

  • @Luaan Wenn Sie bereits alle Daten haben, sehe ich nicht, dass es etwas gibt falsch alles auf einmal schreiben, aber wie diese Frage und Antwort zeigt, write() muss nicht alles schreiben (was auch für kleine Puffer gilt)

    – Rohr

    11. April 2020 um 16:18 Uhr

  • “Ich kann dies beheben, indem ich in eine Schleife schreiben” und Sie müssen, unabhängig von der SSIZE_MAX Beschränkung. Das write() spec sagt, dass es nicht verpflichtet ist, den vollen Puffer zu schreiben, auch wenn dies fast immer der Fall ist. Der schleifenlose Code in der Frage ist ein Fehler.

    – Adam

    11. April 2020 um 17:58 Uhr

Benutzer-Avatar
Bobah

Die Antwort findest du in man 2 write:

Es ist kein Fehler, wenn diese Zahl kleiner ist als die Anzahl der angeforderten Bytes; dies kann beispielsweise passieren, weil das Plattengerät gefüllt wurde.


Und von der write() Beschreibung der Manpage:

ssize_t write(int fd, const void *buf, size_t count);

Nach POSIX.1, wenn count ist größer als SSIZE_MAX, das Ergebnis ist implementierungsdefiniert; siehe ANMERKUNGEN für die Obergrenze unter Linux.

ANMERKUNGEN

Unter Linux, write() (und ähnliche Systemaufrufe) werden höchstens übertragen
0x7ffff000 (2.147.479.552) Bytes, wobei die Anzahl der tatsächlich übertragenen Bytes zurückgegeben wird. (Dies gilt sowohl für 32-Bit- als auch für 64-Bit-Systeme.)

1384930cookie-checkWarum hinterlässt das Schreiben kontinuierlich 4 KB im Puffer?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy