非同步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 虛擬機器的網絡卡要開啟 ...