FreeBSDs/DragonFlyBSD sendfile() 系统调用应该如何工作?

FreeBSDs/DragonFlyBSD sendfile() 系统调用应该如何工作?

发送文件()

参数offset是类型off_t并且nbytes是类型,size_t而两者都描述相同的事物:文件长度。如果我的文件长于off_t但短于怎么办size_t?如果我异步发送,我当前的文件偏移量可能会大于off_t,但我仍然想发送更多,因为size_t更大。

off_t总是较低,因为它是有符号的和size_t无符号的。

我知道你可以设置nbytes = 0,但我明确想使用长度。

答案1

offset参数nbytes描述的不是同一件事。相反,它们分别描述了从文件中复制字节的开始位置和结束位置。

如果您的文件大小为 131,072 字节 (128KiB),并且您使用offset16,384 和nbytes32,768,sendfile()则将从文件上的位置 16,384 复制到位置 49,152,总计 32KiB(由 指定nbytes),从 开始offset

如果您使用offset114,688 和nbytes32,768,则将sendfile()从位置 114,688 复制到文件末尾位置 131,072,总共 16KiB。由于文件比预期短nbytessendfile()因此发送的数据将少于请求的数据。

如果使用offset147,456 和nbytes32,768,那么sendfile()将发送 0 字节。如果开头超过文件末尾,则不会有任何字节可供复制,因此它不会发送任何内容。

最后,有一种特殊情况nbytes设置为 0,它将复制文件的全部内容,因此如果您使用offset0 和nbytesof 0,sendfile()则将为整个文件发送总共 131,072 字节 (128KiB)。

相关内容