9

写系统调用原型为:

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

count 参数是无符号的,返回值是有符号的。

帮助页面说:

成功时,返回写入的字节数(零表示未写入任何内容)。出错时,返回 -1,并errno进行适当设置。

但是,它没有说明 count 参数的限制是什么。它仍然没有说明 count 大于时的行为SSIZE_MAX

考虑到 write 是一个可用于通用设备/文件/任何东西的系统调用,如果设备支持大于 SSIZE_MAX 的写入操作,则返回类型无法处理写入的实际字节数。

能够传递无符号字节数并返回有符号字节数对我来说没有意义。为什么不只传递一个签名号码?

感觉就像 write 函数的原型有点容易出错,或者至少它在路径上留下了一个可能的漏洞。

有谁知道它的详细信息或我在哪里可以找到这些信息?

4

3 回答 3

2

我认为没有硬性限制,这取决于fd指向什么。例如,如果它是文件系统上的文件,那么如果超过“最大文件大小限制”,文件系统驱动程序将阻塞,返回 EFBIG 错误:

EFBIG试图写入超过实现定义的最大文件大小或进程文件大小限制的文件。

于 2012-09-21T13:52:15.063 回答
1

谷歌搜索:

如果 nbyte 的值大于{SSIZE_MAX} ,则结果是实现定义的。

来源: http: //pubs.opengroup.org/onlinepubs/009695399/functions/write.html

于 2012-09-21T14:30:55.853 回答
0

我想记住系统分配给函数的字节数。但我不确定。也许您应该尝试 size_t 和 ssize_t 手册页。

于 2012-09-21T13:45:08.423 回答