为什么连续写入会在缓冲区中保留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字节。我可以通过将写操作包装在循环中并向上移动缓冲区来解决此问题,但我很好奇为什么它总是会失败。

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

鲍伯:

您可以在man 2 write:-)中找到答案我也会仔细检查我的代码...

如果此数目小于请求的字节数,这不是错误;例如,由于磁盘设备已装满,可能会发生这种情况。


并从write()手册页描述中:

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

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

笔记

在Linux上,write()(和类似的系统调用)将最多传输0x7ffff000(2,147,479,552)字节,并返回实际传输的字节数。(在32位和64位
系统上都是如此。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么连续写入会在缓冲区中保留4K字节?

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

内置追加与字节。缓冲区写入

为什么没有将缓冲区写入FileChannel

为什么 ReadFile 函数将垃圾写入缓冲区?

为什么导致给定程序缓冲区溢出的输入会导致分段错误?

管道缓冲区大小是4k还是64k?

当缓冲区不包含任何项目时,为什么Rx缓冲区连续执行方法?

为什么string.Builder Reset()不保留底层缓冲区?

为什么需要在NSInvocation-getArgument:atIndex:上保留__unsafe_unretain缓冲区?

为什么我的代码不后退并将输入保留在缓冲区中?

为什么scanf()似乎加载的地址低于我正在写入的缓冲区的地址?

将缓冲区写入文件不会返回错误,那么为什么文件后记为空?

为什么 Node.js 在写入文件时会缩短我的缓冲区?

为什么GL_RASTERIZER_DISCARD无法使我写入模板缓冲区?

为什么目录/ lost + found 16K而不是4K字节?

字节缓冲区NSData

“写入缓存缓冲区刷新”是什么意思

为什么字符缓冲区内容大小是 4 个字节?

D-是否有用于读取和写入字节的字节缓冲区?

为什么 Vim 选项被记录为由新缓冲区继承的“本地缓冲区”?

为什么位缓冲区和缓冲区给我不同的输出?

为什么std :: to_string的实现创建的缓冲区是类型大小的4倍?

为什么在HDD / SSD基准测试中进行4K读取要比写入慢?

NVMe ssd:为什么4k的写入速度比读取速度快?

为什么缓冲区应该在64字节边界上对齐以获得最佳性能?

将int复制到字节缓冲区时,为什么要用memcpy / memmove反转数据?

为什么在 C 中读取和写入套接字时应该使用循环缓冲区?

从屏幕回滚缓冲区中将大量(超过4k)的文本复制到系统剪贴板中