免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3144 | 回复: 2
打印 上一主题 下一主题

【已解决】各位,关于一个writev和O_DIRECT标志位冲突的文件I/O问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-28 10:03 |只看该作者 |倒序浏览
本帖最后由 almeydifer 于 2011-02-28 14:46 编辑

大家好,小的在做系统的时候碰到以下问题。具体描述如下:

1.用一个O_DIRECT标志位打开一个文件。(必须的)
2.然后write一些buffer到这个打开的文件里。

现在因为想用writev去取代write来提升一些性能,
但是发现文件在开了O_DIRECT标志位后,writev写不进去内容,终端提示“invalid argument"错误。
但是取消O_DIRECT标志位后,则没有问题,但是现在的要求就是不能去除O_DIRECT标志位。

不知道各位了解这个是什么问题引起的?如何解决?代码如下。
  1. #include <stdio.h>  
  2. #include <sys/types.h>  
  3. #include <sys/stat.h>  
  4. #include <fcntl.h>  
  5. #include <string.h>  
  6. #include <sys/uio.h>  
  7.   
  8. int main()  
  9. {  
  10.     struct iovec iov[3];  
  11.     ssize_t nr;  
  12.     int fd, i;  
  13.        
  14.     char *buf[3];
  15.       
  16.         buf[0] = (char *)valloc( strlen("HI!") );
  17.         buf[1] = (char *)valloc( strlen("This is Dingdly.") );
  18.         buf[2] = (char *)valloc( strlen("Bye!") );
  19.        
  20.         memcpy( buf[0], "HI!", strlen("HI!") );
  21.         memcpy( buf[1], "This is Dingdly.", strlen("This is Dingdly.") );
  22.         memcpy( buf[2], "Bye!", strlen("Bye!") );
  23.        
  24.     fd = open("buccaneer.txt", O_WRONLY | O_CREAT | O_TRUNC);  
  25.     if( fd == -1){  
  26.         perror("open");  
  27.         return 1;  
  28.     }  
  29.       
  30.     for (i = 0; i < 3; i ++){  
  31.         iov[i].iov_base = buf[i];  
  32.         iov[i].iov_len = strlen(buf[i]);  
  33.     }  
  34.       
  35.     nr = writev(fd, iov, 3);  
  36.        
  37.     if(nr == -1){  
  38.         perror("writev");  
  39.         return 1;  
  40.     }
  41.        
  42.     if(close(fd))  
  43.     {  
  44.         perror("close");  
  45.         return 1;  
  46.     }  
  47.        
  48.     return 0;  
  49. }  
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-02-28 14:47 |只看该作者
惭愧,解决方法是这样的:

valloc后的内存,必须以512为单位写入到O_DIRECT标志位打开的文件,

而不是我上面的iov[i].iov_len = strlen(buf[i]); 。

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
3 [报告]
发表于 2011-03-02 21:07 |只看该作者
我记得是page align啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP