Winapi 一个文件可以关联多少个I/O完成端口?

Winapi 一个文件可以关联多少个I/O完成端口?,winapi,Winapi,我知道用一个文件进行更多IOCP是没有用的。但是否真的有一个硬限制,即每个文件记录一个IOCP?我在文档中找不到任何说明有限制的内容。内部文件由表示。这里存在字段CompletionContext,它可以是0(最初)或指向IO\u COMPLETION\u CONTEXT。此结构在wdm.h中定义 这里的端口是指向IOCP的引用指针(内部是KQUEUE对象,在ntifs.h中声明)。因此,从这里可以看到,与文件关联的IOCP不超过1个。因此,将现有IOCP与需要使用的文件或CreateIoCom

我知道用一个文件进行更多IOCP是没有用的。但是否真的有一个硬限制,即每个文件记录一个IOCP?我在文档中找不到任何说明有限制的内容。

内部文件由表示。这里存在字段CompletionContext,它可以是0(最初)或指向
IO\u COMPLETION\u CONTEXT
。此结构在wdm.h中定义

这里的端口是指向IOCP的引用指针(内部是KQUEUE对象,在ntifs.h中声明)。因此,从这里可以看到,与文件关联的IOCP不超过1个。因此,将现有IOCP与需要使用的文件或
CreateIoCompletionPort
函数(设计非常奇怪的api)关联起来。如果在端口已设置后调用文件,则会出现错误(
STATUS\u INVALID\u PARAMETER

从Windows 8.1开始,添加了新的文件信息类-:

更改或删除指定文件的I/O完成端口 手柄调用者提供一个指向 指定端口的结构 句柄和完成键。如果端口句柄为非NULL,则 句柄指定要与文件关联的新I/O完成端口 手柄删除与文件关联的I/O完成端口 句柄,将结构中的端口句柄设置为NULL。得到一个港口 句柄,用户模式调用方可以调用CreateIoCompletionPort 功能

由此也间接清楚了,只有一个端口可以在文件上-如果有多个-更改或删除I/O完成端口哪个端口

请注意,FileCompletionInformation和FileReplacementCompletionInformation都使用结构作为输入

typedef struct _FILE_COMPLETION_INFORMATION {
  HANDLE Port;
  PVOID  Key;
} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
轻松查看它仅与IOCP(而不是直接指针)对应的
IO_COMPLETION_CONTEXT
HANDLE


请注意,FileReplacementCompletionInformation在任何时候都不能替换文件上现有的IOCP,但只有在调用此api时文件上没有活动的I/O请求时(与文件对象关联的IRP列表必须为空),否则将返回
STATUS\u UNSUCCESSFUL

堆栈溢出是为了解决实际编程问题。只有1个iocp可以与fileMaybe关联,但我没有找到文档记录。你有链接吗?@BonitaMontero-direct没有,但不是全部都有文档记录。这一点可以通过阅读以下内容来理解。当然,我们不仅需要阅读文档,还需要更多的东西。
typedef struct _FILE_COMPLETION_INFORMATION {
  HANDLE Port;
  PVOID  Key;
} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;