c - “writev”中“iovcnt”参数的允许最大值?

时间:2014-12-03 12:29:12

标签: c unix

我已阅读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;
}

1 个答案:

答案 0 :(得分:4)

这是我在一些手册页中找到的:

  

POSIX.1-2001允许实现对数字设置限制   的          可以在iov中传递的项目。实现可以通告它          通过在&lt; limits.h&gt;中定义IOV_MAX来限制或者在运行时通过返回          来自sysconf(_SC_IOV_MAX)的值。在Linux上,通告的限制          这些机制是1024,这是真正的内核限制。然而          glibc包装函数如果检测到它们会做一些额外的工作          底层内核系统调用失败,因为超出了此限制。