《Windows via C/C++》学习笔记 —— 设备I/O之“同步的设备I/O”(系列文章)
前面曾经讲过,设备I/O的方式有两种:同步和异步。本篇介绍一下同步设备I/O。主要涉及到两个函数:ReadFile和WriteFile。
不要被这两个函数的名称迷惑,不仅可以将这两个作用于文件,也可以作用于其他设备:比如管道、邮槽等。
最简单的设备I/O,可以通过ReadFile和WriteFile这两个函数来实现:
BOOL ReadFile(
HANDLE hFile, //设备对象句柄
PVOID pvBuffer, //读取缓冲区
DWORD nNumBytesToRead, //读取的字节数
PDWORD pdwNumBytes, //返回实际读取的字节数
OVERLAPPED* pOverlapped); //重叠结构指针,仅在异步方式有用
BOOL WriteFile(
HANDLE hFile,
CONST VOID *pvBuffer,
DWORD nNumBytesToWrite,
PDWORD pdwNumBytes, //返回实际写入的字节数
OVERLAPPED* pOverlapped);
在同步方式下使用这2个函数进行设备I/O,在同步模式下,两个函数的最后一个参数pOverlapped都要设置为NULL。另外,必须要注意这一点:就是在用CreateFile创建或打开设备之时,其FLAG参数不能包括FLAG_FILE_OVERLAPPED,否则系统认为你想要异步地实现设备I/O。
另外,ReadFile只能读取这些设备,即在使用CreateFile创建或打开设备的时候,该函数的FLAG参数中包括GENERIC_READ。而WriteFile只能写入这些设备,即使用CreateFile函数的时候,FLAG参数包括GENERIC_WRITE。
邮槽、管道、文件、串行端口等设备是有自己的高速缓存的。如果在CreateFile函数的FLAG参数中没有包括FILE_FLAG_NO_BUFFERING,也就是可以将写入的数据暂存在缓冲区中,那么可以通过FlushFileBuffers来强行将暂存在与设备有关的缓冲区中的全部数据写入到设备中。
BOOL FlushFileBuffers(HANDLE hFile);
同步方式的设备I/O实现简单,但是缺点也是明显的,就是会阻碍有关线程中的其他与设备I/O无关的操作。因为设备I/O函数直到设备I/O请求结束才返回,如果数据量大,很可能会阻碍其他无关的操作。
为了解决这个问题,你应该尽量使用异步的设备I/O。但是可惜的是,Windows API中,没有为CreaetFile这个函数提供任何异步的方式来实现。Windows Vista提供了另一种方法:中途取消同步设备I/O。可以通过使用函数CancelSynchronousIo来取消一个线程之内的正在进行的同步设备I/O操作。
BOOL CancelSynchronousIo(HANDLE hThread); //参数是线程句柄
该函数接受一个线程句柄,该句柄是一个正在等待同步设备I/O操作完成的线程的句柄。该句柄在创建或打开的时候,必须具有THREAD_TERMINATE操作权限。如果你调用CreateThread或_beginthreadex函数来创建线程,那么返回的线程句柄就包含THREAD_TERMINATED的操作权限。如果使用OpenThread函数来获得一个已创建的线程的句柄,那么就传递THREAD_TERMINATED给dwDesiredAccess参数(第1个参数)。如果没有设置该权限,那么CancelSynchronousIo返回FALSE,调用GetLastError返回ERROR_ACCESS_DENIED(访问拒绝错误)。
如果线程已经结束了等待设备I/O,那么再调用CancelSynchronousIo函数会返回TRUE,而不是FLASE,调用GetLastError则返回ERROR_OPERATION_ABORTED(操作失败错误)。
如果线程并不是等待在设备I/O的返回上,那么调用该函数会返回FALSE,随后调用GetLastError会返回ERROR_NO_FOUND(未找到的错误)。
http://www.cnblogs.com/wz19860913/archive/2008/08/18/1270523.html
《Windows via C/C++》学习笔记 —— 设备I/O之“同步的设备I/O”(系列文章)的更多相关文章
- WebSocket学习笔记IE,IOS,Android等设备的兼容性问
WebSocket学习笔记IE,IOS,Android等设备的兼容性问 一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏 ...
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- <转>Windows平台下Makefile学习笔记(二)
本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...
- Ionic2学习笔记(9):访问本地设备
作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5559927.html Ionic2提供了访问本地设备的方法,但是需要安装 ...
- windows内核对象管理学习笔记
目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object ...
- <转>Windows平台下Makefile学习笔记(一)
本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发 ...
- 【VS开发】Windows平台下Makefile学习笔记
作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...
- <<Windows via C/C++>>学习笔记 —— 线程优先级【转】
转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,3 ...
- WebSocket 学习笔记--IE,IOS,Android等设备的兼容性问题与代码实现
一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏览器来实现,其中数据通信,准备使用WebSocket的方式.于是,我开始 ...
随机推荐
- matplotlib油漆基础
http://blog.csdn.net/pipisorry/article/details/37742423 matplotlib介绍 matplotlib 是python最著名的画图库,它提供了一 ...
- Windows下快速搭建安卓开发环境android-studio
Windows下快速搭建安卓开发环境android-studio 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 安卓 搭建 Android Windows 快速 环境 Studi ...
- PAT 1061 - 1064 题解
这四道题来自 13 年 08 月 30 的 PAT 测试. 代码量不大,思路也比较直接.不过第一题的处理逻辑不太清晰,需要好好把握.稍有不慎就掉进坑里了(很多人被这道 20'的题坑了一个多小时心慌意乱 ...
- qmake生成vcproj & sln
qmake生成的vs工程与环境变量中的 qmakespec相关,可以有两种方法: 1.默认情况下,即环境变量qmakespec为你装的qt for vs的版本,默认生成的为该版本的vs工程,如,你装的 ...
- git commit 报错 There was a problem with the editor 'vi'
今天提交代码git commit -a的时候出现了这个错误 上网查了一下,说是Vim的返回值出错了,出错的原因还在翻译英文, 先贴出解决方案吧 git config --global core.ed ...
- 嵌套函数中的this
function countDown(){ var self = this; var doWork = function(){ console.log(this);//window console.l ...
- url参数解析
http://happycoder.net/parse-querystring-using-regexp/ http://www.cnblogs.com/babycool/p/3169058.html ...
- Focusable 属性和IsTabStop 属性之间的关系
原文:Focusable 属性和IsTabStop 属性之间的关系 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Libby1984/article ...
- Windows Presentation Foundation (WPF)中的命令(Commands)简述
原文:Windows Presentation Foundation (WPF)中的命令(Commands)简述 ------------------------------------------- ...
- 随机森林算法原理及OpenCV应用
随机森林算法是机器学习.计算机视觉等领域内应用较为广泛的一个算法.它不仅可以用来做分类(包括二分类和多分类),也可用来做回归预测,也可以作为一种数据降维的手段. 在随机森林中,将生成很多的决策树,并不 ...