Saya pada dasarnya memiliki kode berikut:
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;
}
Ini berfungsi jika ukurannya 1GB, tetapi ketika ukurannya ~ 2GB, ia mendapatkan 4K byte tersisa secara konsisten. Saya dapat memperbaikinya dengan membungkus tulis dalam satu lingkaran dan memindahkan buffer ke atas tapi saya ingin tahu mengapa selalu gagal.
Misalnya jika ukurannya adalah 2147483648, tulis hanya tulislah 2147479552, meninggalkan 4096 tidak tertulis. Mengapa ini terjadi dan apakah benar untuk selalu membungkus tulis dalam satu lingkaran?
c
linux
system-calls
TreeWater
sumber
sumber
write
akan dikonsumsi sekaligus tergantung pada apa jenis wastafel datafile
(misalnya file "biasa", pipa, soket aliran, soket datagram, ...). Bisakah Anda lebih spesifik?write
seluruh file sekaligus? Pendekatan yang biasa dilakukan adalah mengalirkan data dalam ukuran buffer pada satu waktu sampai Anda menulis semuanya.write()
tidak harus menulis semuanya (yang berlaku untuk buffer kecil juga)SSIZE_MAX
batasannya. Thewrite()
Spec mengatakan tidak berkewajiban untuk menulis buffer penuh, bahkan jika itu hampir selalu tidak. Kode loop-less dalam pertanyaan adalah bug.Jawaban:
Anda dapat menemukan jawabannya di
man 2 write
:Dan dari
write()
deskripsi halaman manual:sumber