c-为什么连续写入会在缓冲区中留下4K字节



我基本上有以下代码:

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;
}

如果大小为1GB,它就可以工作,但当大小为~2GB时,它会一直保留4K字节。我可以通过将write封装在循环中并向上移动缓冲区来解决这个问题,但我很好奇为什么它总是失败。

例如,如果大小为2147483648,则只写2147479552,而不写4096。为什么会发生这种情况?总是将写包装在循环中是否正确?

您可以在man 2 write:中找到答案

如果此数字小于字节数,则不是错误请求;这可能是因为磁盘设备已填充。


并且来自write()手册页描述:

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

根据POSIX.1,如果count大于SSIZE_MAX,则结果是实施定义的;有关Linux上的上限,请参阅NOTES。

注意事项

在Linux上,write()(以及类似的系统调用(最多将传输0x7ffff000(2147479552(字节,返回字节数实际转移。(32位和64位都是如此系统。(

最新更新