当句柄关闭时,将从端口中删除与I/O完成端口关联的句柄.如果是网络套接字,则通过调用关闭句柄closesocket()
.
CreateIoCompletionPort的文档包含有关资源处理的备注:
FileHandle参数中传递的句柄可以是支持重叠I/O的任何句柄.最常见的是,这是CreateFile函数使用FILE_FLAG_OVERLAPPED标志(例如,文件,邮件槽和管道)打开的句柄.由其他函数(如socket)创建的对象也可以与I/O完成端口关联.有关使用套接字的示例,请参阅AcceptEx.句柄只能与一个I/O完成端口关联,并且在建立关联后,句柄仍然与该I/O完成端口关联,直到它关闭.
...
I/O完成端口句柄和与该特定I/O完成端口关联的每个文件句柄称为对I/O完成端口的引用.当没有更多引用时,将释放I/O完成端口.因此,必须正确关闭所有这些句柄以释放I/O完成端口及其关联的系统资源.满足这些条件后,通过调用CloseHandle函数关闭I/O完成端口句柄.
微软显然不希望普通用户这样做,但是尽管如此,有一种正式记录的方式(它只需要进行大量的挖掘就可以找到它):
调用NtSetInformationFile
,传递值FileReplaceCompletionInformation
的FileInformationClass
参数,将完成它。(此值在中定义FILE_INFORMATION_CLASS
)
此参数值的描述副本(重点是我的):
更改或删除指定文件句柄的I / O完成端口。调用方提供指向FILE_COMPLETION_INFORMATION结构的指针,该结构指定端口句柄和完成键。如果端口句柄为非NULL,则此句柄指定一个新的I / O完成端口以与文件句柄关联。要删除与文件句柄关联的I / O完成端口,请将结构中的端口句柄设置为NULL。 要获取端口句柄,用户模式调用者可以调用CreateIoCompletionPort函数。