c select函数

1
 

/*

头文件:

/* According to POSIX.1-2001 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

原型:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

int pselect(int nfds, fd_set *readfds, fd_set *writefds,
               fd_set *exceptfds, const struct timespec *timeout,
               const sigset_t *sigmask);

 

void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

功能:

connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。

可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。

参数:

nfds是readfds、writefds和exceptfds文件描述符集合中最大的文件描述符+1.

readfds和writefds是被监控是否可读写的文件描述符集合。

exceptfds不监控此文件描述符集合,错误异常?

timeout是select等待I/O的最长时间,如果timeval结构体是0,那么select立即返回,如果timeout为null,select无限阻塞。

返回值:

>0  就绪的文件描述符个数;

=0  超时;

-1  出错,errno被设置。

 

 

 

四个宏:

FD_CLR将文件描述符从集合中删除;

FD_ISSET判断文件描述符是否在集合中。

FD_SET将文件描述符加入集合;

FD_ZERO清除集合;

fd_set和timeval结构体:

The time structures involved are defined in <sys/time.h> and look like

           struct timeval {
               long    tv_sec;         /* seconds */
               long    tv_usec;        /* microseconds */
           };

           struct timespec {
               long    tv_sec;         /* seconds */
               long    tv_nsec;        /* nanoseconds */
           };

*/

 

 

总结:简而言之,select是为了在socket通信时实现非阻塞方式

posted @ 2012-09-23 13:20  helloweworld  阅读(234)  评论(0编辑  收藏  举报