Ich habe im Wesentlichen den 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 KByte übrig. Ich kann dies beheben, indem ich das Schreiben in eine Schleife einwickle und den Puffer nach oben verschiebe, aber ich bin gespannt, warum es immer fehlschlägt.
Wenn die Größe beispielsweise 2147483648 ist, werden beim Schreiben nur 2147479552 geschrieben, wobei 4096 ungeschrieben bleibt. Warum sollte dies passieren und ist es richtig, das Schreiben immer in eine Schleife zu packen?
c
linux
system-calls
Baumwasser
quelle
quelle
write
hängen von der Art der Datensenke abfile
(z. B. "normale" Datei, Pipe, Stream-Socket, Datagramm-Socket usw.). Kannst du genauer sein?write
die gesamte Datei auf einmal? Der übliche Ansatz besteht darin, die Daten jeweils in Puffergröße zu streamen, bis Sie alles schreiben.write()
müssen Sie nicht alles schreiben (was auch für kleine Puffer gilt)SSIZE_MAX
Einschränkung tun. Diewrite()
Spezifikation besagt, dass es nicht verpflichtet ist, den vollständigen Puffer zu schreiben, auch wenn dies fast immer der Fall ist. Der schleifenlose Code in der Frage ist ein Fehler.Antworten:
Die Antwort finden Sie in
man 2 write
:Und aus der
write()
Manpage-Beschreibung:quelle