Eu tenho essencialmente o seguinte código:
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;
}
Funciona se o tamanho é de 1 GB, mas quando o tamanho é de ~ 2 GB, obtém 4K bytes permanentemente. Eu posso corrigir isso colocando a gravação em um loop e movendo o buffer para cima, mas estou curioso para saber por que está sempre falhando.
Por exemplo, se o tamanho for 2147483648, somente as gravações serão gravadas 2147479552, deixando 4096 não gravadas. Por que isso aconteceria e é correto sempre envolver a gravação em um loop?
c
linux
system-calls
ÁrvoreÁgua
fonte
fonte
write
consumidos ao mesmo tempo dependem do tipo de coletor de dadosfile
(por exemplo, arquivo "regular", canal, soquete de fluxo, soquete de datagrama, ...). Você pode ser mais específico?write
o arquivo inteiro de uma só vez? A abordagem usual é transmitir os dados com um tamanho de buffer por vez até você escrever tudo.write()
não precisa escrever tudo (o que também vale para pequenos buffers)SSIZE_MAX
restrição. Awrite()
especificação diz que não tem obrigação de escrever o buffer completo, mesmo que quase sempre o faça. O código sem loop na pergunta é um bug.Respostas:
Você pode encontrar a resposta em
man 2 write
:E a partir da
write()
descrição da página de manual:fonte