我已阅读writev
的手册页,并发现错误部分指出
EINVAL ...向量计数
iovcnt
小于零或大于允许的最大值。
但我怎么能得到最大值?
PS:在我的操作系统(Ubuntu 14.04 x64)上似乎是1024.我通过以下代码检查它
#include <stdlib.h>
#include <fcntl.h>
#include <sys/uio.h>
char content[4000];
struct iovec vec[4000];
int main()
{
int n, i;
// int cnt = 1024; // OK
int cnt = 1025; // writev error
int fd = open("tmp.txt", O_WRONLY);
if (fd == -1) {
perror("open");
exit(1);
}
for (i = 0; i < cnt; ++i) {
content[i] = 'a' + i % 26;
vec[i].iov_base = content + i;
vec[i].iov_len = 1;
}
n = writev(fd, vec, cnt);
if (n == -1) {
perror("writev");
exit(1);
}
return 0;
}
答案 0 :(得分:4)
这是我在一些手册页中找到的:
POSIX.1-2001允许实现对数字设置限制 的 可以在iov中传递的项目。实现可以通告它 通过在&lt; limits.h&gt;中定义IOV_MAX来限制或者在运行时通过返回 来自sysconf(_SC_IOV_MAX)的值。在Linux上,通告的限制 这些机制是1024,这是真正的内核限制。然而 glibc包装函数如果检测到它们会做一些额外的工作 底层内核系统调用失败,因为超出了此限制。