Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET
?在Linux中,內(nèi)核利用文件描述符(File Descriptor)即文件句柄,來訪問文件。文件描述符是非負(fù)整數(shù)。打開現(xiàn)存文件或新建文件時(shí),內(nèi)核會(huì)返回一個(gè)文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。宏FD_ZERO、FD_SET、FD_CLR、FD_ISSET中“FD”即為file descriptor的縮寫,下面來一一進(jìn)行介紹。
?????? 首先介紹一個(gè)重要的結(jié)構(gòu)體:fd_set,它會(huì)作為下面某些函數(shù)的參數(shù)而多次用到,fd_set可以理解為一個(gè)集合,這個(gè)集合中存放的是文件描述符(file descriptor),即文件句柄。fd_set集合可以通過下面的宏來進(jìn)行人為來操作。
1》FD_ZERO
用法:FD_ZERO(fd_set*);
用來清空fd_set集合,即讓fd_set集合不再包含任何文件句柄。
2》FD_SET
用法:FD_SET(int ,fd_set *);
用來將一個(gè)給定的文件描述符加入集合之中
3》FD_CLR
用法:FD_CLR(int ,fd_set*);
用來將一個(gè)給定的文件描述符從集合中刪除
4》FD_ISSET
用法:FD_ISSET(int ,fd_set*);
檢測fd在fdset集合中的狀態(tài)是否變化,當(dāng)檢測到fd狀態(tài)發(fā)生變化時(shí)返回真,否則,返回假(也可以認(rèn)為集合中指定的文件描述符是否可以讀寫)。
5》函數(shù)select
用法:int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
作用:用來夠監(jiān)視我們需要監(jiān)視的文件描述符(讀或?qū)懙奈募械奈募枋龇?#xff09;的狀態(tài)變化情況。并能通過返回的值告知我們。
參數(shù)解釋:
int maxfdp:集合中所有文件描述符的范圍,為所有文件描述符的最大值加1。
fd_set *readfds:要進(jìn)行監(jiān)視的讀文件集。
fd_set *writefds :要進(jìn)行監(jiān)視的寫文件集。
fd_set *errorfds:用于監(jiān)視異常數(shù)據(jù)。
struct timeval* timeout:select的超時(shí)時(shí)間,它可以使select處于三種狀態(tài):
第一,若將NULL以形參傳入,即不傳入時(shí)間結(jié)構(gòu),就是 將select置于阻塞狀態(tài),一定等到監(jiān)視文件描述符集合中某個(gè)文件描述符發(fā)生變化為止;
第二,若將時(shí)間值設(shè)為0秒0毫秒,就變成一個(gè)純粹的非阻塞函數(shù), 不管文件描述符是否有變化,都立刻返回繼續(xù)執(zhí)行,文件無變化返回0,有變化返回一個(gè)正值;
第三,timeout的值大于0,這就是等待的超時(shí)時(shí)間,即 select在timeout時(shí)間內(nèi)阻塞,超時(shí)時(shí)間之內(nèi)有事件到來就返回了,否則在超時(shí)后不管怎樣一定返回。
struct?timeval?timeout;?timeout.tv_sec?=?0;?//秒?timeout.tv_usec?=?dwTimeout?*?1000;?//微秒?1毫秒?=?1000微秒返回值介紹:
>0:被監(jiān)視的文件描述符有變化
-1:出錯(cuò)
0 :超時(shí)
總結(jié)
以上是生活随笔為你收集整理的Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用C语言进行完数的判断(for循环和数组
- 下一篇: 2020计算机保研系列「最终篇」 ——