linux應用基礎知識點16 並髮式IO的實現

2021-10-05 04:10:32 字數 2608 閱讀 2651

非同步io

阻塞式io帶來的問題:

比如當讀取鍵盤和操作滑鼠兩個事件都是以阻塞方式操作的話,那麼兩個裝置的使用順序必須嚴格按照程式的流程走,否則會阻塞住無法走下去。

並髮式io的實現方法:

1.非阻塞io

2.多路復用io(select poll)

3.非同步通知(非同步io)

對於未開啟檔案在open時使用o_nonblock標誌,對於已開啟檔案使用fcntl新增o_nonblock標誌。

該方法可以實現功能,但是由於相當於採用輪詢的方式來操作各路io,因此存在占用資源的問題,影響cpu的效能。

可以通過select或 poll函式來實現(unix**成systemv和bsd兩大門派,各自提供了乙個多路復用io函式,linux將兩個智慧型都吸納進來了)。

原理:外部阻塞式,內部非阻塞式自動輪詢多路阻塞式io。

解讀:select/poll本身是阻塞函式,當程序呼叫該函式時會產生阻塞; select/poll函式內部是非阻塞的,它以自動輪詢的方式掃瞄所管理的各路io;被管理的各路io均是阻塞方式; select/poll函式檢測到某路io有訊號時,立即上報。

select函式

int

select

(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds,

struct timeval *timeout)

;

nfds代表要輪詢的檔案描述符範圍,設為最大檔案描述符的值+1;

readfds 用來監聽是否有可讀取資料的io;

writefds 用來監聽要被寫入的io是否阻塞;

exceptfds 用來監聽異常的io;

timeout用來設定select阻塞的時間,如果超時則返回。

其中,fd_set結構體用來儲存復用的io,以及相應io的狀態。linux提供了相關函式對該結構體進行操作。

int

fd_isset

(int fd, fd_set *set)

;//用來檢視io介面的狀態

void

fd_set

(int fd, fd_set *set)

;//用來新增乙個io介面對應的檔案描述符

void

fd_clr

(int fd, fd_set *set)

;//用來去除乙個io介面對應的檔案描述符

void

fd_zero

(fd_set *set)

;//用來清除fd_set結構體的所有內容

例:

int fd=-1,ret=-1; 

fd_set myset;

struct timeval tm;

fd = open(...);//open一路io

fd_zero(&myset); //先清除

fd_set(fd, &myset);//後設定,這裡可以多次呼叫設定多路io

tm.tv_sec = 10; //設定超時時間

tm.tv_usec = 0;

ret = select(fd+1, &myset, null, null, &tm);

if(ret<0){} //返回錯誤

else if(ret == 0) {} //select超時

else

}

poll函式
int

poll

(struct pollfd *fds, nfds_t nfds,

int timeout)

;

fds設定了需要被管理的io;

nfds為輪詢的範圍;

timeout為poll阻塞超時的時間。

其中,fds裡包含了所有需要被管理的io,以及該io的配置資訊和狀態資訊。

struct pollfd 

;

events和revents值為pollin(可讀) pollout(可寫) pollerr(錯誤)等。設定poll時,需要指定fd和events。當兩者的值相同時,即該io的條件滿足。

例:

int ret = -1,fd=-1;

struct pollfd myfds[n]=; //定義乙個pollfd結構體陣列,假設共有n路io,則有n個結構體

fd = open(...);//open一路io

myfds[0].fd = fd;//設定第0項pollfd

myfds[0].events = pollin;

ret = poll(myfds, fd+1, 1000); //呼叫poll函式,等待1000ms即1s

if(ret<0){} //返回錯誤

else if(ret == 0) {} //select超時

else

int main(void)

//處理主要的工作

}

Linux 基礎知識點 16 nc

nc是netcat的簡寫,可以用來取代telnet進行某些服務埠的檢測工作。作用 常用引數 l 用於指定nc將處於偵聽模式。指定該引數,則意味著nc被當作server s 指定傳送資料的源ip位址,適用於多網絡卡機 u 指定nc使用udp協議,預設為tcp v 輸出互動或出錯資訊,新手除錯時尤為有用...

linux基礎知識點

1.在vmware安裝linux系統和快照功能使用。注意 2.系統目錄介紹 1 表示根目錄 2 表示 root 3 etc 存放系統配置目錄 4 home 除了root以為所有使用者預設在home下新建乙個以使用者名為資料夾名稱的資料夾。5 usr 所有使用者安裝的軟體都放入這個資料夾中。知識點擴充...

linux基礎知識點複習

暫時先放一些linux的一些操作的東西 1 vm 虛擬機器 2 redhad 作業系統 3 xshell 終端軟體 4 notepad 編碼 5 課件 思維導圖 mindmanage word ppt xshell nat模式連線 ssh ip位址 注意 1 必須要有網 2 虛擬機器的網絡卡要開啟 ...