回顧同時讀鍵盤、滑鼠的方法
1)多程序
2)多執行緒
3)將「讀滑鼠」和「讀鍵盤」設定為非阻塞
4)多路io(select、poll機制)
5)非同步io
前面四種方式都是主動的去讀,對於read函式來說它並不知道是不是一定有資料,如果有資料就讀到資料,沒有資料要麼阻塞直到讀到資料為止,要麼就不阻塞。
這就好比我想去買商品,我不知道商品還有沒有剩餘,我去了後如果有剩餘我就立即買(立即讀資料),如果沒有剩餘要麼等(阻塞讀),要麼離開過段時間再來看(非阻塞讀)。
實際上除了以上描述的方式外,還有另外一種聰明的方式,那就是使用非同步io的方式來實現。
非同步io的原理就是,底層把資料準備好後,核心就會給程序傳送乙個「非同步通知的訊號」通知程序,表示資料準備好了,然後呼叫訊號處理函式去讀資料,在沒有準備好時,程序忙自己的事情。
這就好比我跟商店老闆說一聲「有商品了打**給我啊」,我就回去該忙啥就忙啥了,等老闆通知我了我就知道有商品了,我去購買,這樣的方式不就更好嗎。
比如使用非同步io讀滑鼠,底層滑鼠驅動把資料準備好後,會發乙個「sigio」(非同步通知訊號)給程序,程序呼叫捕獲函式讀滑鼠,讀滑鼠的sigio捕獲函式需要我們自己定義。
程序正常阻塞讀鍵盤,然後將讀滑鼠設定為非同步io方式。
程序正常阻塞讀鍵盤時,如果滑鼠沒有資料的話,程序不關心讀滑鼠的事情,如果滑鼠資料來了,底層滑鼠驅動就會向程序傳送乙個sigio訊號,然後呼叫註冊的sigio訊號捕獲函式讀滑鼠資料。
**說明:
當然也可以反過來,程序正常阻塞讀滑鼠,然後將讀鍵盤設定為非同步io方式。
比如以非同步io方式讀滑鼠資料為例,如果知道什麼時間資料會來,等這個時間到時再去讀資料,這就是步調統一的同步讀。
如果不知道什麼時候會有資料來,這種就只能是什麼時候資料來了就什麼時候讀,這種就是非同步的讀。之所叫非同步,是因為我不知道你什麼時候來,沒辦法統一步調(非同步的),只能是隨時來是隨時讀。
使用非同步io有兩個前提:
(1)底層驅動必須要有相應的傳送sigio訊號的**,只有這樣當底層資料準備好後,底層才會傳送sigio訊號給程序。
我們之所以可以對滑鼠設定非同步io,是因為人家在實現滑鼠驅動時,有寫傳送sigio訊號的**,如果驅動程式是我們自己寫的,傳送sigio的**就需要我們自己來寫。
(2)應用層必須進行相應的非同步io的設定,否者無法使用非同步io
滑鼠驅動和鍵盤驅動底層都有傳送sigio的**,我們對於滑鼠和鍵盤進行設定的時候只需要在應用層設定即可實現。
應用層進行非同步io設定時,使用的也是fcntl函式。
下面步驟沒有先後順序區分。
(1)呼叫signal函式對sigio訊號設定捕獲函式
在捕獲函式裡面實現讀操作,比如讀滑鼠。
(2)使用fcntl函式,將接收sigio訊號的程序設定為當前程序
如果不設定的,底層驅動並不知道將sigio訊號傳送給哪乙個程序。
fcntl(mousefd, f_setown, getpid());
(3)使用fcntl函式,對檔案描述符增設o_async的狀態標誌,讓fd支援非同步io
mousefd =
open
("/dev/input/mouse1"
, o_rdonly)
; flag =
fcntl
(mouse_fd, f_getfl)
;flag |
= o_async;
//補設o_async
fcntl
(mouse_fd, f_setfl, flag)
;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void
print_err
(char
*str,
int line,
int err_no)
//錯誤處理
int mousefd =0;
void
signal_fun
(int signo)
//在捕獲函式裡面讀取滑鼠
}int
main
(void);
struct pollfd fds[2]
; mousefd =
open
("/dev/input/mouse0"
, o_rdonly);if
(mousefd ==-1
)print_err
("open mouse0 fail"
,__line__
, errno)
;//為sigio設定捕獲函式,在捕獲函式裡面讀滑鼠
signal
(sigio, signal_fun)
;//告訴滑鼠驅動,他傳送的sigio訊號由當前程序接收
fcntl
(mousefd, f_setown,
getpid()
);//對mousefd進行設定,讓其支援非同步io
int *** =
fcntl
(mousefd, f_getfl)
; *** |
= o_async;
fcntl
(mousefd, f_setfl, ***)
;while(1
)return0;
}
執行結果為:
Python 高階程式設計與非同步IO併發程式設計!
python中一切皆物件 動態語言和靜態語言 1.python中面對物件更徹底,在 python 中 class 魔法函式,包括 和模組都可以是物件,讓動態語言的特性得到充分的體現 2.函式和類也是物件,屬於一等公民 python資源共享群 626017123 def ask name bobby ...
同步IO和非同步IO
同步io和非同步io 簡單的說 同步在程式設計裡,一般是指某個io操作執行完後,才可以執行後面的操作。非同步則是,將某個操作給系統,主線程去忙別的事情,等核心完成操作後通知主線程非同步操作已經完成。i windows同步i o與非同步i o 執行後的效果如下 winxp sp2 vc6.0 4 心得...
同步IO和非同步IO
同步io和非同步io 有兩種型別的檔案io同步 同步檔案io和非同步檔案io。非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而 非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請...