《Win32多线程程序设计》(12)---overlapped I/O

文字版电子书-----请点击这里

overlapped I/O  是Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。

i 激发的文件handles
i 激发的event  对象
i 异步过程调用(Asynchronous Procedure Calls,APCs)
i I/O completion ports


Win32 文件操作函数

Win32 之中有三个基本的函数用来执行I/O,它们是:
iCreateFile()
iReadFile()
iWriteFile()

CreateFile() 可以用来打开各式各样的资源,包括(但不限制于):

i 文件(硬盘、软盘、光盘或其他)
i 串行口和并行口(serial and parallel ports)
iNamed pipes
iConsole


HANDLE CreateFile( 
LPCTSTR lpFileName, // 指向文件名称
DWORD dwDesiredAccess, // 存取模式(读或写)
DWORD dwShareMode, // 共享模式(share mode)
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性结构
DWORD dwCreationDisposition, // 如何产生
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 一个临时文件,将拥有全部的属性拷贝
);

其中第6个参数dw FlagsAndAttributes 是使用overlapped  I/O 的 关 键。这个参数可以藉由许多个数值组合在一起而完成,其中对于本处讨论最重要的一个数值便是FILE_ FLAG_OVERLAPPED。你可以藉着这个参数,指定使用同步(传统的)调用,或是使用overlapped(异步)调用,但不能够两个都指定。
换句话说,如果这个标记值设立,那么对该文件的每一个操作都将是overlapped。
一个不常被讨论的overlapped  I/O 性质是,它可以在同一时间读(或写)文件的许多部分。微妙处在于这些操作都使用相同的文件handle。因此,当你使用overlapped  I/O时,没有所谓“目前的文件位置”这样的观念。每一次读或写的操作都必须包含其文件位置。
如果你发出许多个overlapped  请求,那么执行次序无法保证。虽然你在单一磁盘中对文件进行操作时很少会有这样的行为,但如果面对多个磁盘,或不同种类的设备(如网络和磁盘),就常常会看到I/O  请求完全失去次序。


BOOL ReadFile( 
HANDLE hFile, // 欲读之文件
LPVOID lpBuffer, // 接收数据之缓冲区
DWORD nNumberOfBytesToRead, // 欲读取的字节个数
LPDWORD lpNumberOfBytesRead, // 实际读取的字节个数的地址
LPOVERLAPPED lpOverlapped // 指针,指向overlapped info 
); 
BOOL WriteFile( 
HANDLE hFile, // 欲写之文件
LPCVOID lpBuffer, // 储存数据之缓冲区
DWORD nNumberOfBytesToWrite, // 欲写入的字节个数
LPDWORD lpNumberOfBytesWritten, // 实际写入的字节个数的地址
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值