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