有没有办法在 Windows 中异步打开文件? CreateFile API 函数只有 FILE_FLAG_OVERLAPPED,允许进一步异步读取和写入。尽管如此,文件的打开似乎是同步的。鉴于它必须访问文件系统(并可能执行昂贵的 IO 操作),它可能是一个潜在的阻止者。
这实际上是一个根本问题,是否可以在 .NET 中异步打开文件(因为无法等待 FileStream ctor)。但如果操作系统中无法做到这一点,那么这个问题就毫无意义。
不幸的是,在用户模式下无法异步创建/打开文件。即使司机回来了STATUS_PENDING
for IRP_MJ_CREATE,在这种情况下系统将等待,直到驱动程序完成IRP
在它从创建/打开文件函数之一返回控制之前。
只有当我们处于内核模式时才有可能,如果您自己格式化IRP_MJ_CREATE并将其发送给司机。但即使在这种情况下,驱动程序几乎总是会处理IRP_MJ_CREATE同步地。
对于 API 来说是异步的 - 操作完成时必须以某种方式通知调用者
windows 为此使用了 3 种方法
- 参数中的一些回调例程,通常是 APC (
PIO_APC_ROUTINE
)
操作完成时调用
- 参数中的一些Event,当操作完成时,Event设置在
信号状态。
- 文件句柄,用于api调用,与某些IOCP绑定。什么时候
操作完成的数据包将排队到 IOCP。 (我们稍后通过调用删除这个数据包GetQueuedCompletionStatus (
ZwRemoveIoCompletion
) or KeRemoveQueue
3)在我们的例子中是不可能的,因为文件句柄尚未创建,所以它不能绑定到任何IOCP。关于 1) 和 2) 让我们查找文件打开/创建 api 签名:
在用户模式下,打开/创建文件的最低级别 api 是ZwOpenFile and ZwCreateFile. CreateFile外壳已过ZwCreateFile
。在内核模式下NtOpenFile
-> NtCreateFile
-> IoCreateFile -> IoCreateFileEx even - IoCreateFileEx(创建文件的最低级别 api) - 没有事件或 [Apc] 回调参数 - 所以不是异步的。IoCreateFileEx call ObOpenObjectByName
(未记录,但导出例程) - 这里也没有 1) 或 2) 参数 - 这又是通过设计 api 同步的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)