gpt4 book ai didi

c - writev(或pwritev)会与c中的O_DIRECT冲突吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:41 28 4
gpt4 key购买 nike

我尝试将 writevdirect 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;
}

所以我认为这可能是内存对齐问题,所以我将它们调整为如下所示的内存对齐缓冲区:

#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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com