zoukankan      html  css  js  c++  java
  • 对libpq中运用 select()函数的理解

    src/test/examples/testlibpq2.c 中,有如下一段代码:

    sock = PQsocket(conn);                                
                                    
    FD_ZERO(&input_mask);                                
    FD_SET(sock, &input_mask);                                
                                    
    if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)                                
    {                                
        fprintf(stderr, "select() failed: %s\n", strerror(errno));                            
        exit_nicely(conn);                            
    }
    ......

    经过查阅网络资料,看到解释如下:

    FD_ZERO(fd_set   *fdset);
    文件描述符集合初始化

    FD_SET(fd_set   *fdset); 增加一个新的文件描述符。

    int   select
    (int   maxfd,fd_set   *rdset,fd_set   *wrset,fd_set   *exset,struct   timeval   *timeout);    

    参数maxfd 是需要监视的最大的文件描述符值+1;
     rdset, wrset, exset
    分别对应于需要检测的 可读文件描述符的集合,可写文件描述符的 集合 及 异常文件描述符的集合。
    struct timeval
    结构用于描述一段时间长度,
    如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。

    从代码的上下文看,select()并非是什么非阻塞,而是要休眠,直至操作系统发现文件描述符集合变化,
    把调用 select()函数的进程唤醒。

  • 相关阅读:
    7-11
    7-9
    7-8
    7-7
    7-6
    7-5
    7-4
    7-3
    第08次:升级《陋习手记》完善主从UI
    第07次:升级《陋习手记》显示多条数据
  • 原文地址:https://www.cnblogs.com/gaojian/p/2590013.html
Copyright © 2011-2022 走看看