阻塞方式: block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。
非阻塞方式:non-block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函式的執**況。如果事件發生則與阻塞方式相同,若事件沒有發生則返回乙個**來告知事件未發生,而程序或執行緒繼續執行,所以效率高。可以使用select()就可以完成非阻塞。
**片段如下:
fd_set twritefds;
fd_zero(&twritefds);// 將檔案描述符集合清空
fd_set(n_currentfd, &twritefds);// 加入自己的檔案描述符
struct timeval ttimeout;
ttimeout.tv_sec = 1;
ttimeout.tv_usec = 0;
// 檢查檔案描述符是否可寫
s32 nret = select(fd_setsize, (fd_set*)null, &twritefds, (fd_set*)null, &ttimeout);
if (nret <= 0)
if( fd_isset(n_currentfd, &twritefds) == 0 )
cmicdatamanager::getinstance()->semtake();
nret = cmicdatamanager::getinstance()->write(pbybuf,dwsize,emmtwrite,dwmode);
cmicdatamanager::getinstance()->semgive();
return nret;
select()將更新這個集合,把其中不可讀/不可寫/無異常的套接字去掉,只保留符合條件的套接字在這個集合裡面。
使用select函式的過程一般是:先呼叫巨集fd_zero將指定的fd_set清零,然後呼叫巨集fd_set將需要測試的fd加入fd_set,接著呼叫函式select測試fd_set中的所有fd,最後用巨集fd_isset檢查某個fd在函式select呼叫後,相應位是否仍然為1。
對於fd_set型別通過下面四個巨集來操作:
fd_zero(fd_set *fdset) 將指定的檔案描述符集清空,在對檔案描述符集合進行設定前,必須對其進行初始化,如果不清空,由於在系統分配記憶體空間後,通常並不作清空處理,所以結果是不可知的。
fd_set(int fd, fd_set *fdset) 用於在檔案描述符集合中增加乙個新的檔案描述符fd。
fd_clr(int fd, fd_set *fdset) 用於在檔案描述符集合中刪除乙個檔案描述符fd。
fd_isset(int fd, fd_set *fdset) 用於測試指定的檔案描述符fd是否在該集合fdset中。
阻塞 非阻塞的概念和select函式的阻塞功能
1 阻塞block 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。例如socket程式設計中connect accept recv recvfrom這樣的阻塞程式。再如絕大多數的函式呼叫 語句執行...
阻塞 非阻塞的概念和select函式的阻塞功能
分類 網路程式設計 2012 05 29 21 52 21人閱讀收藏 舉報 1 阻塞block 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。例如socket程式設計中connect accept...
阻塞 非阻塞的概念和select函式的阻塞功能
其它文件 1 阻塞block 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。例如socket程式設計中connect accept recv recvfrom這樣的阻塞程式。再如絕大多數的函式呼叫...