[实战] Windows 文件读写函数 `ReadFile()` 和 `WriteFile()` 的阻塞与非阻塞操作详解(含完整C语言示例)

Windows文件读写函数阻塞与非阻塞操作详解

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
    )
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客不孤独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值