【发布时间】:2012-09-13 22:43:41
【问题描述】:
写入系统调用原型为:
ssize_t write(int fd, const void *buf, size_t count);
count参数是无符号的,返回值是有符号的。
帮助页面显示:
成功时,返回写入的字节数(零表示未写入任何内容)。
出错时返回-1,并适当设置errno。
但是,它并没有说明 count 参数的限制是多少。
当计数大于SSIZE_MAX 时,它仍然没有说明行为。
考虑到 write 是一个可用于通用设备/文件/任何东西的系统调用,如果设备支持大于 SSIZE_MAX 的写入操作,则返回类型无法处理实际写入的字节数。
传递无符号字节数并返回有符号字节数对我来说没有意义。为什么不直接传递一个签名号码?
感觉就像 write 函数的原型有点容易出错,或者至少它在路径中留下了一个可能的漏洞。
有没有人知道它的详细信息或者我在哪里可以找到这些信息?
【问题讨论】:
-
我自己不知道,但我相信限制是无符号整数的大小。这意味着,您应该能够一次写入 4294967296 个字节。在这种情况下,返回值为 -1(您必须检查 errno 以确保它实际上是一个错误)
-
POSIX says "如果 nbyte 的值大于 {SSIZE_MAX},则结果是实现定义的",因此缺少 Linux 手册页 -- 它应该描述这一点。
-
习惯上 write() 使用较小的块。我很难想象用单个系统调用写入千兆字节的情况是个好主意。
-
我不想写一大堆数据。问题是我正在编写一个平台抽象层,我需要为这个函数创建一个包装器。我将它用于套接字。我想了解与这种情况相关的问题。
-
@Marcus:对于套接字,您的限制可能远低于
SSIZE_MAX,并且与ioctl和/或setsockopt在套接字上配置的缓冲区大小相关。