【已解决】各位,关于一个writev和O_DIRECT标志位冲突的文件I/O问题。
时间:2011-02-28
来源:互联网
本帖最后由 almeydifer 于 2011-02-28 14:46 编辑
大家好,小的在做系统的时候碰到以下问题。具体描述如下:
1.用一个O_DIRECT标志位打开一个文件。(必须的)
2.然后write一些buffer到这个打开的文件里。
现在因为想用writev去取代write来提升一些性能,
但是发现文件在开了O_DIRECT标志位后,writev写不进去内容,终端提示“invalid argument"错误。
但是取消O_DIRECT标志位后,则没有问题,但是现在的要求就是不能去除O_DIRECT标志位。
不知道各位了解这个是什么问题引起的?如何解决?代码如下。
复制代码
大家好,小的在做系统的时候碰到以下问题。具体描述如下:
1.用一个O_DIRECT标志位打开一个文件。(必须的)
2.然后write一些buffer到这个打开的文件里。
现在因为想用writev去取代write来提升一些性能,
但是发现文件在开了O_DIRECT标志位后,writev写不进去内容,终端提示“invalid argument"错误。
但是取消O_DIRECT标志位后,则没有问题,但是现在的要求就是不能去除O_DIRECT标志位。
不知道各位了解这个是什么问题引起的?如何解决?代码如下。
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <string.h>
- #include <sys/uio.h>
-
- int main()
- {
- struct iovec iov[3];
- ssize_t nr;
- int fd, i;
-
- char *buf[3];
-
- buf[0] = (char *)valloc( strlen("HI!") );
- buf[1] = (char *)valloc( strlen("This is Dingdly.") );
- buf[2] = (char *)valloc( strlen("Bye!") );
-
- memcpy( buf[0], "HI!", strlen("HI!") );
- memcpy( buf[1], "This is Dingdly.", strlen("This is Dingdly.") );
- memcpy( buf[2], "Bye!", strlen("Bye!") );
-
- fd = open("buccaneer.txt", O_WRONLY | O_CREAT | O_TRUNC);
- if( fd == -1){
- perror("open");
- return 1;
- }
-
- for (i = 0; i < 3; i ++){
- iov[i].iov_base = buf[i];
- iov[i].iov_len = strlen(buf[i]);
- }
-
- nr = writev(fd, iov, 3);
-
- if(nr == -1){
- perror("writev");
- return 1;
- }
-
- if(close(fd))
- {
- perror("close");
- return 1;
- }
-
- return 0;
- }
作者: almeydifer 发布时间: 2011-02-28
惭愧,解决方法是这样的:
valloc后的内存,必须以512为单位写入到O_DIRECT标志位打开的文件,
而不是我上面的iov[i].iov_len = strlen(buf[i]); 。
valloc后的内存,必须以512为单位写入到O_DIRECT标志位打开的文件,
而不是我上面的iov[i].iov_len = strlen(buf[i]); 。
作者: almeydifer 发布时间: 2011-02-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28