Windows 文件读写函数 ReadFile() 和 WriteFile() 的阻塞与非阻塞操作详解(含完整C语言示例)
在 Windows 平台进行文件或设备(如串口、管道)编程时,ReadFile() 和 WriteFile() 是最常用的两个 API 函数。它们既可以以阻塞方式运行,也可以通过设置标志实现非阻塞方式运行。本文将详细讲解这两种模式的区别,并提供完整的 C 语言示例代码。
一、概述:ReadFile() 和 WriteFile() 简介
这两个函数定义在 windows.h 头文件中:
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
- hFile:文件或设备的句柄。
- lpBuffer:数据缓冲区地址。
- nNumberOfBytesTo(Read/Write):要读写的字节数。
- lpNumberOfBytes(Read/Written):实际读写的数据长度。
- lpOverlapped:重叠结构指针。为 NULL 表示同步(阻塞)操作;否则表示异步(非阻塞)操作。
二、阻塞操作 vs 非阻塞操作
| 特性 | 阻塞操作(默认) | 非阻塞操作(异步) |
|---|---|---|
| 是否等待完成 | 是,调用线程会被挂起直到操作完成 | 否,函数立即返回,操作由系统后台完成 |
| 是否需要 OVERLAPPED 结构 | 否 | 是 |
| 是否支持事件通知 | 否 | 可结合事件对象进行通知 |
| 是否支持 I/O 完成端口 | 否 | 是 |
| CPU 使用率 | 较低(等待期间休眠) | 较高(需主动轮询或使用回调) |
| 实现复杂度 | 简单 | 复杂 |
三、阻塞方式示例
✅ 示例1:阻塞方式读写文件
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile = CreateFile(
TEXT("testfile.txt"),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
)

最低0.47元/天 解锁文章
944

被折叠的 条评论
为什么被折叠?



