我试着把writev和direct IO结合起来。但是当我和他们结合的时候我失败了。
下面的代码可以工作,但如果在open()时添加O_DIRECT,则失败
失败的时候我总是得到“无效的论据”。

int main(){
    char *str0 = "hello ";
    char *str1 = "world\n";
    struct iovec iov[2];
    ssize_t nwritten;

    iov[0].iov_base = str0;
    iov[0].iov_len = strlen(str0);
    iov[1].iov_base = str1;
    iov[1].iov_len = strlen(str1);

    int fd = open("./foo",O_RDWR|O_CREAT);// will fail if add O_DIRECT
    nwritten = writev(fd, iov, 2);
    printf("num:%ld,%s\n", nwritten, strerror(errno));

    close(fd);
    return 0;
}

所以我认为这可能是内存对齐问题,所以我将它们调整为一个memaligned缓冲区,如下所示:
#define BLOCKSIZE 512
int main(){
    char *str0 = "hello ";
    char *str1 = "world\n";
    struct iovec iov[2];
    ssize_t nwritten;

    void *buffer, *buffer1;
    posix_memalign(&buffer, BLOCKSIZE, BLOCKSIZE);
    memcpy(buffer, str0, strlen(str0));
    posix_memalign(&buffer1, BLOCKSIZE, BLOCKSIZE);
    memcpy(buffer1, str1, strlen(str1));

    iov[0].iov_base = buffer;
    iov[0].iov_len = strlen(buffer);
    iov[1].iov_base = buffer1;
    iov[1].iov_len = strlen(buffer1);

    int fd = open("./foo",O_RDWR|O_CREAT|O_DIRECT);
    nwritten = writev(fd, iov, 2);
    printf("num:%ld,%s\n", nwritten, strerror(errno));

    close(fd);
    free(buffer);
    return 0;
}

但还是失败了。
有什么办法解决这个问题吗?

最佳答案

您应该尝试将两个iov_len都设置为BLOCKSIZE,但文件大小不会是strlen(str0)+strlen(str1)。

关于c - writev(或pwritev)是否会与C中的O_DIRECT冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47967454/

10-12 17:07