Mam zasadniczo następujący kod:
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;
}
Działa, jeśli rozmiar wynosi 1 GB, ale gdy rozmiar wynosi ~ 2 GB, konsekwentnie pozostaje 4K bajtów. Mogę to naprawić, owijając zapis w pętli i przesuwając bufor w górę, ale jestem ciekawy, dlaczego zawsze zawodzi.
Na przykład, jeśli rozmiar to 2147483648, tylko do zapisu zapisuje 2147479552, pozostawiając 4096 niepisany. Dlaczego tak się dzieje i czy poprawne jest zawsze zawijanie zapisu w pętli?
c
linux
system-calls
TreeWater
źródło
źródło
write
zostanie zużyte jednocześnie, zależą od typu ujścia danychfile
(np. „Zwykły” plik, potok, gniazdo strumienia, gniazdo datagramu, ...). Czy mógłbyś to sprecyzować?write
jednocześnie otworzyć cały plik? Zwykle stosuje się przesyłanie strumieniowe danych wielkości bufora na raz, dopóki nie napisze się wszystkiego.write()
nie musi to wszystko (co idzie do małych buforów zbyt) napisaćSSIZE_MAX
ograniczeń.write()
Spec mówi, że nie ma obowiązku, aby napisać cały bufor, nawet jeśli jest prawie zawsze. Kod bez pętli w pytaniu jest błędem.Odpowiedzi:
Odpowiedź znajdziesz w
man 2 write
:I z
write()
opisu strony man:źródło