免费注册 查看新帖 |

Chinaunix

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

急求解答!Linux中异步IO的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-27 18:45 |只看该作者 |倒序浏览
代码片段如下:
(首先通过io_setup分配了i个异步io的请求空间)
n1 = io_submit(pt_aio->ctx, i, pt_aio->iocbpp);//提交i个异步io请求
n2 = io_getevents(pt_aio->ctx, i, i, events, NULL);//等待被提交的io请求全部完成

其中i = 200, 其他参数也已经(我认为)成功赋值
但是返回值为 n1=54。
意思是不是说200个异步IO请求中有54个已经被成功提交?那剩下的146个呢?

但是奇怪的是n2=200, 为什么明明只成功提交了54个异步IO请求,却完成了200个呢?

论坛徽章:
0
2 [报告]
发表于 2011-04-27 22:14 |只看该作者
异步读操作,向内核发出读的命令,传入的参数是一个aiocb的结构,比如

  struct aiocb myaiocb;

  memset(&aiocb , 0x00 , sizeof(myaiocb));

  myaiocb.aio_fildes = fd;

  myaiocb.aio_buf = new char[1024];

  myaiocb.aio_nbytes = 1024;

  if (aio_read(&myaiocb) != 0)

  {

  printf("aio_read error:%sn" , strerror(errno));

  return false;

  }

  3. int aio_write(struct aiocb *aiocbp);

  异步写操作,向内核发出写的命令,传入的参数仍然是一个aiocb的结构,当文件描述符的O_APPEND

  标志位设置后,异步写操作总是将数据添加到文件末尾.如果没有设置,则添加到aio_offset指定的

  地方,比如:

  struct aiocb myaiocb;

  memset(&aiocb , 0x00 , sizeof(myaiocb));

  myaiocb.aio_fildes = fd;

  myaiocb.aio_buf = new char[1024];

  myaiocb.aio_nbytes = 1024;

  myaiocb.aio_offset = 0;

  if (aio_write(&myaiocb) != 0)

  {

  printf("aio_read error:%sn" , strerror(errno));

  return false;

  }

  4. int aio_error(const struct aiocb *aiocbp);

  如果该函数返回0,表示aiocbp指定的异步I/O操作请求完成.

  如果该函数返回EINPROGRESS,表示aiocbp指定的异步I/O操作请求正在处理中.

  如果该函数返回ECANCELED,表示aiocbp指定的异步I/O操作请求已经取消.

  如果该函数返回-1,表示发生错误,检查errno.

  5. ssize_t aio_return(struct aiocb *aiocbp);

  这个函数的返回值相当于同步I/O中,read/write的返回值.只有在aio_error调用后

  才能被调用.

  6. int aio_cancel(int fd, struct aiocb *aiocbp);

  取消在文件描述符fd上的aiocbp所指定的异步I/O请求
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP