参数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),并且您使用offset
16,384 和nbytes
32,768,sendfile()
则将从文件上的位置 16,384 复制到位置 49,152,总计 32KiB(由 指定nbytes
),从 开始offset
。
如果您使用offset
114,688 和nbytes
32,768,则将sendfile()
从位置 114,688 复制到文件末尾位置 131,072,总共 16KiB。由于文件比预期短nbytes
,sendfile()
因此发送的数据将少于请求的数据。
如果使用offset
147,456 和nbytes
32,768,那么sendfile()
将发送 0 字节。如果开头超过文件末尾,则不会有任何字节可供复制,因此它不会发送任何内容。
最后,有一种特殊情况nbytes
设置为 0,它将复制文件的全部内容,因此如果您使用offset
0 和nbytes
of 0,sendfile()
则将为整个文件发送总共 131,072 字节 (128KiB)。