阻塞函式和select

2021-10-07 22:12:25 字數 1436 閱讀 5262

阻塞方式: 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這樣的阻塞程式。再如絕大多數的函式呼叫...