select()函数使用

    xiaoxiao2023-11-05  162

    select() 函数允许程序监视多个文件描述符,等待一个或多个文件描述符为某类I/O操作变为“就绪”。

    /* 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 *readfds, fd_set *exceptfds, struct timeval *timeout);

    参数解析:

    nfds:是三组中任何一组中(readfds、writefds、exceptfds)编号最大的文件描述符,加1;readfds、readfds、exceptfds:分别代表文件描述符集合中是否有可读、可写以及异常的文件描述符;timeout:则表示等待时间;

    fd_set 是一组文件描述符(fb)的集合,它用一位来表示一个fd,对于 fd_set 类型通过下面四个宏来操作:

    void FD_ZERO(fd_set *set); void FD_SET(int fd, fd_set *set); void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); FD_ZERO:将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的;FD_SET:用于在文件描述符集合中增加一个新的文件描述符;FD_CLR:用于在文件描述符集合中删除一个文件描述符;FD_ISSET:测试以查看文件描述符是否是集合的一部分,这在select()函数返回后很有用;

    同时需要注意一点,在 select() 函数返回之后,函数参数(readfds、writefds、exceptfds)的值都将改变,其中,这些文件描述符集合中,可读、可写、异常的文件描述符的bit将置1,其他置0,所以,在select()函数返回后,通过 FD_ISSET 测试fb是否在可操作集合中,然后可针对该fb进行相应的操作。 还可以通过 select() 函数实现延时,具体的操作,可以百度。

    详细参考文章

    雨奇:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    最新回复(0)