zoukankan      html  css  js  c++  java
  • 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通信时实现非阻塞方式

  • 相关阅读:
    Windowless controls
    System进程无法创建一个Administrator用户的子进程
    PE文件分析工具
    使用IHTMLDocument3 的getElementById获取控件总是返回空的解决方法
    Windows Sockets2 详解2——堵塞与非堵塞模式
    CopySourceAsHtml外部工具版
    像使用C#一样使用C++
    Windows Sockets2 提供者专用扩展机制
    Windows Sockets2 详解1——服务器客户端通讯
    腾讯实习面试(二)
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2698873.html
Copyright © 2011-2022 走看看