非同步IO 高階IO linux (zzm)

2021-10-05 06:20:35 字數 3072 閱讀 2617

回顧同時讀鍵盤、滑鼠的方法

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請...