第十章 同步和異步設(shè)備I/O
1.打開和關(guān)閉設(shè)備對(duì)象
打開設(shè)備
CreateFile CreateMailslot CreateNamedPipe CreatePipe
關(guān)閉設(shè)備
CloseHandle CloseSocket
查看設(shè)備類型
GetFileType
2.文件設(shè)備
Code example:
HANDLE hFile = CreateFile(...);
BYTE pb[10];
DWORD dwNumBytes;
ReadFile(hFile1, pb, 10, &dwNumBytes, NULL);
LARGE_INTEGER liDistanceToMove;
liDistanceToMove.QuadPart = 1024;
SetFilePointerEx(hFile, liDistanceToMove, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile);
3.同步設(shè)備I/O
ReadFile
僅當(dāng)設(shè)備以GENERIC_READ方式打開時(shí)才可調(diào)用ReadFile
WriteFile
僅當(dāng)設(shè)備以GENERIC_WRITE方式打開時(shí)才可調(diào)用WriteFile
FlushFileBuffers
強(qiáng)迫系統(tǒng)將緩沖區(qū)的數(shù)據(jù)寫設(shè)備。
CancelSynchronousIo
如果某個(gè)線程因等待I/O操作而掛起太長時(shí)間,可以調(diào)用該函數(shù)使線程從I/O操作中返回。GetLastError可以取得錯(cuò)誤代碼。
該線程必須符合以下兩個(gè)條件中的一個(gè):
(1)該線程是則CreateThread或_beginThread函數(shù)創(chuàng)建
(2)該線程則OpenThread創(chuàng)建且具有THREAD_TERMINATE權(quán)限
I/O設(shè)備Cancel請(qǐng)求操作最終則設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)。若設(shè)備驅(qū)動(dòng)不支持I/O Cancel.那么CancelSynchronouslo永遠(yuǎn)返回True.
4.異步設(shè)備I/O基本概念
(1)異步請(qǐng)求要求用CreateFile以FILE_FLAG_OVERLAPPED和OVERLAPPED結(jié)構(gòu)體為參數(shù)打開設(shè)備,
(2)OVERLAPPED(重迭)結(jié)構(gòu)體
typedef struct _OVERLAPPED
{
DWORD Internal; // [out] Error code
DWORD InternalHigh; // [out] Number of bytes transferred
DWORD Offset; // [in] Low 32-bit file offset
DWORD OffsetHigh; // [in] High 32-bit file offset
HANDLE hEvent; // [in] Event handle or data
} OVERLAPPED, *LPOVERLAPPED;
OVERLAPPED的意思是線程執(zhí)行I/O請(qǐng)求的時(shí)間與線程執(zhí)行其它任務(wù)的時(shí)間是重迭的。
該結(jié)構(gòu)體用于指定讀、寫文件時(shí)的起始地址,也就是讀、寫文件時(shí)的偏移值。該偏移值(64位)由Offset和OffsetHigh共指定。
該結(jié)構(gòu)體在使用時(shí)一定要先初始化其中三個(gè)變量Offset, OffsetHigh, and hEvent
HasOverlappedIoCompleted宏用于判斷I/O請(qǐng)求是否執(zhí)行完畢
(3)取消異步請(qǐng)求
BOOL CancelIo(HANDLE hFile);
BOOL CancelIoEx(HANDLE hFile, LPOVERLAPPED pOverlapped);.
5.獲取I/O操作完畢通知
有以下四種方法:
(1)通過設(shè)備內(nèi)核對(duì)象獲取通知
設(shè)備對(duì)象也是內(nèi)核對(duì)象。在調(diào)用ReadFile或WriteFile時(shí),設(shè)備對(duì)象會(huì)被置成Non-Signal狀態(tài)。當(dāng)完成讀、寫操作后設(shè)備對(duì)象會(huì)被置成Signal狀態(tài)。
因此可以用WaitForSingleObject WaitForMultipleObject獲取I/O操作完畢的通知。
(2)事件內(nèi)核對(duì)象
OVERLAPPED結(jié)構(gòu)體中有一個(gè)成員是Event對(duì)象的句柄。當(dāng)I/O操作完畢后 相應(yīng)的OVERLAPPED對(duì)象中Event對(duì)象句柄所指向的對(duì)象也會(huì)被置成Signal狀態(tài)。
因此,當(dāng)同時(shí)有多個(gè)I/O異步請(qǐng)求時(shí),通過WaitForMultipleObject等待每個(gè)I/O操作中所對(duì)應(yīng)的OVERLAPPED對(duì)象的Event句柄即可獲得I/O操作完畢的通知。
6.Common API
CreateFile CreateMailslot CreateNamedPipe CreatePipe
GetFileType
聯(lián)系客服