125-POSIX 异步IO(取消操作)
2017-03-29 13:11
281 查看
有时候,我们在请求异步 IO 后又后悔了,怎么办?POSIX 提供了一个取消函数 aio_cancel 来帮我们取消异步 IO 请求。
(2) 参数
aio_cancel 有两个参数,第一个参数表示你想取消哪个描述符上的异步 IO 请求。
第二个参数如果为空,表示取消该描述符上所有的异步 IO 请求,如果不空,表示取消由 aiocbp 指定的异步 IO 请求。
(3) 返回值
AIO_CANCELED:所有请求被成功取消。
AIO_NOTCANCELED:至少有一个请求未被取消,因为它处于异步 IO 的处理过程中,也就是 aio_error 返回值为 EINPROGRESS 的时候。
AIO_ALLDONE:所有请求都已经完成了。
-1:有错误发生,同时设置 errno 变量。
代码
编译和运行
图1 运行结果
从结果里可以看到,无法取消前面发起的异步读操作。
1. aio_cancel
(1) 函数原型int aio_cancel(int fd, struct aiocb *aiocbp)
(2) 参数
aio_cancel 有两个参数,第一个参数表示你想取消哪个描述符上的异步 IO 请求。
第二个参数如果为空,表示取消该描述符上所有的异步 IO 请求,如果不空,表示取消由 aiocbp 指定的异步 IO 请求。
(3) 返回值
AIO_CANCELED:所有请求被成功取消。
AIO_NOTCANCELED:至少有一个请求未被取消,因为它处于异步 IO 的处理过程中,也就是 aio_error 返回值为 EINPROGRESS 的时候。
AIO_ALLDONE:所有请求都已经完成了。
-1:有错误发生,同时设置 errno 变量。
2. 实验
程序 my_aio_cancel.c 演示了 aio_cancel 的使用。代码
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <aio.h> #include <strings.h> #include <errno.h> #define ERR_EXIT(msg) do { perror(msg); exit(1); } while(0) int main() { int fd, ret; char buf[64] = { 0 }; struct aiocb my_aiocb; bzero((char*)&my_aiocb, sizeof(struct aiocb)); my_aiocb.aio_buf = buf; my_aiocb.aio_fildes = STDIN_FILENO; my_aiocb.aio_nbytes = 64; my_aiocb.aio_offset = 0; // 发起异步读请求 ret = aio_read(&my_aiocb); if (ret < 0) ERR_EXIT("aio_read"); // 取消异步读请求 ret = aio_cancel(STDIN_FILENO, &my_aiocb); if (ret == AIO_CANCELED) puts("AIO_CANCELED"); else if (ret == AIO_NOTCANCELED) puts("AIO_NOTCANCELED"); else if (ret == AIO_ALLDONE) puts("AIO_ALLDONE"); else if (ret == -1) ERR_EXIT("aio_cancel"); while((ret = aio_error(&my_aiocb)) == EINPROGRESS) { sleep(1); } if (ret == ECANCELED) puts("ECANCELED"); else if (ret == 0) puts("Request completed"); else if (ret > 0) { errno = ret; ERR_EXIT("aio_error"); } ret = aio_return(&my_aiocb); if (ret < 0) ERR_EXIT("aio_return"); printf("content: %s, return: %d\n", buf, ret); return 0; }
编译和运行
$ gcc my_aio_cancel.c -o my_aio_cancel -lrt $ ./my_aio_cancel
图1 运行结果
从结果里可以看到,无法取消前面发起的异步读操作。
3. 总结
掌握 aio_cancel 函数相关文章推荐
- 123-POSIX 异步IO(异步操作状态)
- 124-POSIX 异步IO(等待异步IO操作)
- GridView操作大全 无代码分页排序 正反双向排序 和下拉菜单DropDownList结合,选中,编辑,取消,删除
- 隐藏很讨厌的“取消”打印对话框,并通过异步回调,取得异步操作的返回结果
- 页面checkbox “全选定” 和 “全取消” 操作的实现(JavaScript)
- 本次操作由于这台计算机的限制而被取消
- ADO执行update 报错“操作已被用户取消”
- POSIX 线程取消点的 Linux 实现(zz)
- office提示“由于本机的限制,该操作已被取消”
- 在ASP.NETAtlas中调用WebService—处理错误,超时以及响应用户的取消操作
- GridView基本的操作 编辑 更新 取消
- 解决访问优盘(MP3)出现 "本次操作由于受计算机的限制而被取消,请与你的系统管理员联系" 的问题
- 解决打开CHM文件,出现"取消操作“的怪现象
- 如何解决查询数据库时出现“用户请求取消当前操作”
- ora-01013 用户请求取消当前的操作
- GridView基本的操作 编辑 更新 取消(一)
- 一个关于 客户端非法取消正在进行的数据提交操作 的问题 的讨论
- "由于本机的限制,该操作已被取消,请与管理员联系!"
- 在ASP.NET Atlas中调用Web Service——处理错误,超时以及响应用户的取消操作
- 运行RAR出现“本次操作由于这台计算机的限制而取消”【解决办法】