writev(或pwritev)会与c中的O_DIRECT冲突吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了writev(或pwritev)会与c中的O_DIRECT冲突吗?相关的知识,希望对你有一定的参考价值。
我试图将writev与直接IO结合起来。但是当我与他们结合时,我失败了。
下面的代码工作,但如果我在open()时添加O_DIRECT失败
失败时我总是得到“无效的参数”。
int main(){
char *str0 = "hello ";
char *str1 = "world
";
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
", nwritten, strerror(errno));
close(fd);
return 0;
}
所以我认为它可能是内存对齐问题,所以我将它们调整为一个memaligned buffer如下所示:
#define BLOCKSIZE 512
int main(){
char *str0 = "hello ";
char *str1 = "world
";
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
", nwritten, strerror(errno));
close(fd);
free(buffer);
return 0;
}
但它仍然失败了。
反正有没有解决这个问题?
答案
您应该尝试将两个iov_len设置为BLOCKSIZE,但文件大小不是strlen(str0)+ strlen(str1)。
以上是关于writev(或pwritev)会与c中的O_DIRECT冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章
在哪个库中编写 writev 和其他在套接字上操作的函数,如 send 以及 .so 文件的位置在哪里
iOS 中的 MPL 库集成。它会与 APPLE 在应用程序购买或任何其他支付规则中发生冲突吗?