进程写入文件时如何高效等待新数据?是否有专用API?
高效读取被其他进程写入的文件方案
直接轮询文件大小或末尾内容是最直观但效率最低的方式,会白白消耗CPU资源。更优的做法是利用操作系统提供的文件变更通知机制,让系统主动告知读取进程文件有新数据写入,再触发读取操作。以下分平台说明具体实现方式:
Windows 平台
Windows 提供了ReadDirectoryChangesW API,可监听目录或文件的变更事件(包括内容写入、大小变化等),步骤如下:
- 打开目标文件所在的目录,获取目录句柄
- 调用
ReadDirectoryChangesW,指定监听FILE_NOTIFY_CHANGE_SIZE或FILE_NOTIFY_CHANGE_LAST_WRITE事件 - API会阻塞直到文件发生变更,此时即可从上次记录的偏移量开始读取新增内容
- 循环调用该API以持续监听后续写入
另外,FindFirstChangeNotification也可实现监听,但ReadDirectoryChangesW能提供更详细的变更信息,更适配这类场景。
Linux/macOS(POSIX 兼容平台)
这类平台有成熟的文件事件监听机制:
- Linux 下用 inotify:
- 调用
inotify_init创建监听实例,inotify_add_watch给目标文件添加IN_MODIFY事件监听 - 通过
read读取inotify事件队列,收到事件后触发读取操作
- 调用
- macOS/BSD 下用 kqueue:
- 用
kqueue创建事件队列,kevent添加EVFILT_VNODE过滤规则,监听NOTE_WRITE事件 - 调用
kevent阻塞等待事件触发,收到通知后读取新增内容
- 用
跨平台兼容方案
如果需要同时支持多系统,可封装一层抽象逻辑,根据操作系统类型调用对应API。若对性能要求不极端,也可采用带延迟的智能轮询:读取到文件末尾后,休眠一段较短时间(如100ms),再检查文件大小是否变化,若变化则读取新增内容。这种方式实现简单,适合轻量场景。
关键注意事项
- 记录每次读取后的文件偏移量,下次读取从该位置开始,避免重复读取旧内容
- 写入进程需使用追加模式(Windows的
FILE_APPEND_DATA、POSIX的O_APPEND),防止写入位置混乱或覆盖 - 处理文件被截断、删除等异常情况,避免读取出错
内容的提问来源于stack exchange,提问作者olpchk
相关产品推荐
相关产品推荐

