Overlapped I O模型深入分析

2021-05-23 08:31:57 字數 3374 閱讀 3995

原文:http://www.yuanma.org/data/2007/0227/article_2351.htm

簡述:

typedef 

struct

//o 

dword  internal;        

//dword  internalhigh;    

//dword  offset;            

//指定檔案的位置,從該位置傳送資料,檔案位置是相對檔案開始處的位元組偏移量。呼叫 readfile或writefile函式之前呼叫程序設定這個成員,讀寫命名管道及通訊裝置時呼叫程序忽略這個成員;

dword  offsethigh;      

//指定開始傳送資料的位元組偏移量的高位字,讀寫命名管道及通訊裝置時呼叫程序忽略這個成員;

handle hevent;            //*

二個重要功能:

:int

char

buf[read_size];

char

szpath[max_path];

checkosversion();

getwindowsdirectory(szpath, 

sizeof

(szpath));

strcat(szpath, 

"//winhlp32.exe");

hfile 

=createfile( szpath,

generic_read,

file_share_read|if

(hfile 

==invalid_handle_value)

memset(

&overlap, 0, 

sizeof

(overlap));

overlap.offset 

=1500

;rc 

=readfile(

hfile,

buf,

read_size,

&numread,

&overlap

);printf(

"issued read request/n");

if(rc)

else

else

}closehandle(hfile);

return

exit_success;

}事件核心物件(hevent):

核心物件(hand)實現的問題:

不能區分那乙個

heven標識事件核心物件。createevent,為每個請求建立乙個事件,初始化每個請求的hevent成員(對同一檔案多個讀寫請求,每個操作繫結乙個event物件)。呼叫waitformultipleobject來等等其中乙個(或全部)完成。

另外event物件必須是手動重置。使用自動重置(在等待event之前設定,

waitforsingleobject()

和 waitformultipleobjects()函式永不返回 )。

自動重置事件

waitforsingleobject()

和 waitformultipleobjects()會等待事件到訊號狀態,隨後又自動將其重置為非訊號狀態,這樣保證了

等待此事件的執行緒中只有乙個會被喚醒。

手動重置事件

需 要使用者呼叫resetevent()才會重置事件。可能有若干個執行緒在等待同一事件,這樣當事件變為訊號狀態時,所有等待執行緒都可以執行了。 setevent()函式用來把事件物件設定成訊號狀態,resetevent()把事件物件重置成非訊號狀態,兩者均需事件物件控制代碼作引數。

相關例子如下:

intchar

buf[read_size];

char

szpath[max_path];

checkosversion();

getwindowsdirectory(szpath, 

sizeof

(szpath));

strcat(szpath, 

"//winhlp32.exe");

hfile 

=createfile( szpath,

generic_read,

file_share_read|if

(hfile 

==invalid_handle_value)

memset(

&overlap, 0, 

sizeof

(overlap));

overlap.offset 

=1500

;rc 

=readfile(

hfile,

buf,

read_size,

&numread,

&overlap

);printf(

"issued read request/n");

if(rc)

else

else

}closehandle(hfile);

return

exit_success;}

非同步過程呼叫(apcs):

(apcs)實現方案:

void winapi fileiocompletionroutine(

dword dwerrorcode, 

//completion code

dword dwnumberofbytestransfered,    

//number of bytes transferred

//pointer to structure with i/o information 

)int

main()

for(i=0

; i<

max_requests; i++)

printf(

"queued!!/n");

for(;;)

closehandle(ghfile);

return

exit_success;

}int

queuerequest(

intnindex, dword dwlocation, dword dwamount)

err 

=getlasterror();

if( err 

==error_invalid_user_buffer 

||err 

==error_not_enough_quota 

||err 

==error_not_enough_memory )

break;}

printf(

"readfileex failed./n");

return-1

;}

重疊 Overlapped IO模型

基本思想 允許應用程式使用重疊資料結構一次投遞乙個或者多個非同步io請求。1建立資料 socket slisten wsasocket af inet,sock stream,ipproto tcp,null,2傳輸資料 wsasend wsarecv tcp wsasendto wsarecvfr...

裝置I O之OVERLAPPED IO重疊

似乎在win32的programming中沒有這個概念呀?要討論這個問題就要追溯到對裝置i o的訪問中.在win32中,使用者不能象以前那樣直接對硬體進行訪問,使得這一層 對開發者而言是個 黑盒 而是提供了一組對應的api的介面.讓開發者 基於提供的介面進行開發,而把低層的訪問交給了driver或者...

js深轉殖深拷貝

不足之處是不能拷貝函式,但是基本夠用 const deepcopy obj json parse json stringify obj 如果涉及拷貝函式 簡單一點 function copy object for const k,v of object.entries object return o...