CreateIoCompletionPort函數

創建輸入/輸出(I / O)完成端口並將其與指定的文件句柄相關聯,或創建尚未與文件句柄相關聯的I / O完成端口,從而允許以後進行關聯。

將打開的文件句柄的實例與I / O完成端口相關聯,可使進程接收有關該文件句柄的異步I / O操作完成的通知。

注意  

此處使用的術語文件句柄是指表示重疊的I / O端點的系統抽象,而不僅僅是磁盤上的文件。任何支持重疊I / O的系統對象(例如網絡端點,TCP套接字,命名管道和郵件插槽)都可以用作文件句柄。有關更多信息,請參見“備註”部分。

 

句法

HANDLE CreateIoCompletionPort(
  HANDLE    FileHandle,
  HANDLE    ExistingCompletionPort,
  ULONG_PTR CompletionKey,
  DWORD     NumberOfConcurrentThreads
);

參數

FileHandle

打開的文件句柄或INVALID_HANDLE_VALUE

該句柄必須指向支持重疊I / O的對象。

如果提供了句柄,則必須打開它才能完成I / O重疊。例如,在使用CreateFile函數獲取句柄時,必須指定FILE_FLAG_OVERLAPPED標誌 。

如果指定了INVALID_HANDLE_VALUE,該函數將創建一個I / O完成端口,而不將其與文件句柄關聯。在這種情況下,ExistingCompletionPort參數必須爲NULL,並且CompletionKey參數將被忽略。

ExistingCompletionPort

現有I / O完成端口或NULL的句柄。

如果此參數指定了現有的I / O完成端口,則該函數將其與FileHandle參數指定的句柄相關聯。如果成功,該函數將返回現有I / O完成端口的句柄;它不會創建新的I / O完成端口。

如果此參數爲NULL,則該函數將創建一個新的I / O完成端口,並且如果FileHandle參數有效,則將其與新的I / O完成端口關聯。否則,不會發生文件句柄關聯。如果成功,該函數將句柄返回到新的I / O完成端口。

CompletionKey

每個句柄用戶定義的完成密鑰,包含在指定文件句柄的每個I / O完成數據包中。有關更多信息,請參見“備註”部分。

NumberOfConcurrentThreads

操作系統可以允許同時處理I / O完成端口的I / O完成數據包的最大線程數。如果ExistingCompletionPort參數不爲NULL,則忽略此參數。

如果此參數爲零,則系統允許的併發運行線程數與系統中的處理器數量一樣。

返回值

如果函數成功,則返回值是I / O完成端口的句柄:

  • 如果ExistingCompletionPort參數爲NULL,則返回值爲新句柄。
  • 如果ExistingCompletionPort參數是有效的I / O完成端口句柄,則返回值就是該句柄。
  • 如果FileHandle參數是有效的句柄,則該文件句柄現在與返回的I / O完成端口關聯。

如果函數失敗,則返回值爲NULL。若要獲取擴展的錯誤信息,請調用GetLastError函數。

備註

可以指示I / O系統向排隊的I / O完成端口發送I / O完成通知包。該 CreateIoCompletionPort函數提供了此功能。

I / O完成端口及其句柄與創建它的進程相關聯,並且不能在進程之間共享。但是,在同一進程中的線程之間可以共享一個句柄。

CreateIoCompletionPort可以在三種不同的模式下使用:

  • 僅創建一個I / O完成端口,而不將其與文件句柄關聯。
  • 將現有的I / O完成端口與文件句柄相關聯。
  • 在一個調用中執行創建和關聯。

要創建不關聯的I / O完成端口,請將FileHandle參數設置爲INVALID_HANDLE_VALUE,將ExistingCompletionPort參數設置爲NULL,並將CompletionKey參數設置爲零(在這種情況下將被忽略)。對於新的I / O完成端口,將NumberOfConcurrentThreads參數設置爲所需的併發值,對於默認值(系統中的處理器數量),請將其設置爲零。

FileHandle參數中傳遞的句柄可以是任何支持重疊I / O的句柄。最常見的是,這是由CreateFile函數使用FILE_FLAG_OVERLAPPED標誌打開的句柄(例如,文件,郵件插槽和管道)。由其他功能(例如套接字)創建的對象也可以與I / O完成端口關聯。有關使用套接字的示例,請參見AcceptEx。一個句柄只能與一個I / O完成端口相關聯,並且在建立關聯之後,該句柄將一直與該I / O完成端口相關聯,直到關閉它爲止。

有關I / O完成端口理論,用法和相關功能的更多信息,請參見I / O完成端口

通過使用ExistingCompletionPort參數中的相同I / O完成端口句柄和FileHandle參數中的不同文件句柄多次調用CreateIoCompletionPort多次,可以將多個文件句柄與單個I / O完成端口關聯

使用CompletionKey參數可幫助您的應用程序跟蹤已完成的I / O操作。CreateIoCompletionPort不會使用此值進行功能控制;而是在與I / O完成端口關聯時將其附加到FileHandle參數中指定的文件句柄。對於每個文件句柄,此完成密鑰應該是唯一的,並且在整個內部完成排隊過程中,它會伴隨文件句柄。當完成數據包到達時,它在GetQueuedCompletionStatus函數調用中返回。該CompletionKey參數也使用PostQueuedCompletionStatus功能排隊自己的專用完成包。

將打開句柄的實例與I / O完成端口關聯後,由於這些函數具有其自己的異步I / O機制,因此無法在ReadFileEx或 WriteFileEx函數中使用它 。

最好不要通過句柄繼承或對DuplicateHandle函數的調用來共享與I / O完成端口關聯的文件句柄 。使用此類重複句柄執行的操作將生成完成通知。建議仔細考慮。

I / O完成端口句柄以及與該特定I / O完成端口關聯的每個文件句柄都稱爲對I / O完成端口的引用。沒有更多引用時,將釋放I / O完成端口。因此,必須正確關閉所有這些句柄才能釋放I / O完成端口及其關聯的系統資源。滿足這些條件後,通過調用CloseHandle函數關閉I / O完成端口句柄 。

在Windows 8和Windows Server 2012中,以下技術支持此功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章