首页 > select fd_set

select fd_set

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

fd_set 结构,是一个数字。 文件描述符fd的值 不能超过1024,而不是数量不能超过1024。

在开发打开句柄多的程序时,最好不要使用select。否则就使用多进程开发。

/usr/include/X11 Xpoll.h 文件

#ifndef _XPOLL_H_

#define _XPOLL_H_



#ifndef WIN32



#ifndef USE_POLL



#include



#include   /* Get the FD_* macros. */



#include



#ifdef CSRG_BASED

#include

# if BSD < 199103

typedef long fd_mask;

# endif

#endif



#define XFD_SETSIZE    256



#ifndef FD_SETSIZE

#define FD_SETSIZE    XFD_SETSIZE

#endif



#ifndef NBBY

#define NBBY    8        /* number of bits in a byte */

#endif



#ifndef NFDBITS

#define NFDBITS (sizeof(fd_mask) * NBBY)    /* bits per mask */

#endif



#ifndef howmany

#define howmany(x,y)    (((x)+((y)-1))/(y))

#endif



#if defined(BSD) && BSD < 198911

typedef struct fd_set {

    fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];

} fd_set;

#endif



# define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)



#define __X_FDS_BITS __fds_bits



#ifndef __FDS_BITS

# define __FDS_BITS(p)  ((p)->__X_FDS_BITS)

#endif



#define __XFDS_BITS(p, n) (__FDS_BITS(p))[n]



#ifndef FD_SET

#define FD_SET(n, p)    (__XFDS_BITS(p, ((n)/NFDBITS)) |= ((fd_mask)1 << ((n) % NFDBITS)))

#endif

#ifndef FD_CLR

#define FD_CLR(n, p)    (__XFDS_BITS((p), ((n)/NFDBITS)) &= ~((fd_mask)1 << ((n) % NFDBITS)))

#endif

#ifndef FD_ISSET

#define FD_ISSET(n, p)  ((__XFDS_BITS((p), ((n)/NFDBITS))) & ((fd_mask)1 << ((n) % NFDBITS)))

#endif

#ifndef FD_ZERO

#define FD_ZERO(p)      bzero((char *)(p), sizeof(*(p)))

#endif



/*

 * The howmany(FD_SETSIZE, NFDBITS) computes the number of elements in the

 * array. before accessing an element in the array we check it exists.

 * If it does not exist then the compiler discards the code to access it.

 */

#define XFD_ANYSET(p)

        ((howmany(FD_SETSIZE, NFDBITS) > 0 && (__XFDS_BITS(p, 0))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 1 && (__XFDS_BITS(p, 1))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 2 && (__XFDS_BITS(p, 2))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 3 && (__XFDS_BITS(p, 3))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 4 && (__XFDS_BITS(p, 4))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 5 && (__XFDS_BITS(p, 5))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 6 && (__XFDS_BITS(p, 6))) ||

        (howmany(FD_SETSIZE, NFDBITS) > 7 && (__XFDS_BITS(p, 7))))



#define XFD_COPYSET(src,dst) {

        int __i__;

        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++)

            __XFDS_BITS((dst), __i__) = __XFDS_BITS((src), __i__);

        }

#define XFD_ANDSET(dst,b1,b2) {

        int __i__;

        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++)

            __XFDS_BITS((dst), __i__) = ((__XFDS_BITS((b1), __i__)) & (__XFDS_BITS((b2), __i__)));

        }

#define XFD_ORSET(dst,b1,b2) {

        int __i__;

        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++)

        __XFDS_BITS((dst), __i__) = ((__XFDS_BITS((b1), __i__)) | (__XFDS_BITS((b2), __i__)));

        }        

#define XFD_UNSET(dst,b1) {

        int __i__;

        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++)

            __XFDS_BITS((dst), __i__) &= ~(__XFDS_BITS((b1), __i__));

        }



#else /* USE_POLL */

#include

#endif /* USE_POLL */



#else /* WIN32 */



#define XFD_SETSIZE    256

#ifndef FD_SETSIZE

#define FD_SETSIZE    XFD_SETSIZE

#endif

#include



#define Select(n,r,w,e,t) select(0,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)



#define XFD_SETCOUNT(p)    (((fd_set FAR *)(p))->fd_count)

#define XFD_FD(p,i) (((fd_set FAR *)(p))->fd_array[i])

#define XFD_ANYSET(p)    XFD_SETCOUNT(p)



#define XFD_COPYSET(src,dst) {

    u_int __i;

    FD_ZERO(dst);

    for (__i = 0; __i < XFD_SETCOUNT(src) ; __i++) {

        XFD_FD(dst,__i) = XFD_FD(src,__i);

    }

    XFD_SETCOUNT(dst) = XFD_SETCOUNT(src);

}



#define XFD_ANDSET(dst,b1,b2) {

    u_int __i;

    FD_ZERO(dst);

    for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) {

        if (FD_ISSET(XFD_FD(b1,__i), b2))

       FD_SET(XFD_FD(b1,__i), dst);

    }

}



#define XFD_ORSET(dst,b1,b2) {

    u_int __i;

    if (dst != b1) XFD_COPYSET(b1,dst);

    for (__i = 0; __i < XFD_SETCOUNT(b2) ; __i++) {

        if (!FD_ISSET(XFD_FD(b2,__i), dst))

       FD_SET(XFD_FD(b2,__i), dst);

    }

}



/* this one is really sub-optimal */

#define XFD_UNSET(dst,b1) {

    u_int __i;

    for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) {

    FD_CLR(XFD_FD(b1,__i), dst);

    }

}



/* we have to pay the price of having an array here, unlike with bitmasks

   calling twice FD_SET with the same fd is not transparent, so be careful */

#undef FD_SET

#define FD_SET(fd,set) do {

    if (XFD_SETCOUNT(set) < FD_SETSIZE && !FD_ISSET(fd,set))

        XFD_FD(set,XFD_SETCOUNT(set)++)=(fd);

} while(0)



#define getdtablesize() FD_SETSIZE



#endif /* WIN32 */



#endif /* _XPOLL_H_ */

转载于:https://my.oschina.net/u/1445488/blog/351502

更多相关:

  • fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据,则无法对数据进行指定标记(数据的发送者,接受者,大小。。。)。 SERVER端代码如下: /*...

  • 文章目录介绍重定向函数介绍总结 linux terminal输入如下命令,其中"|"符号即为我们上文中所说的无名管道 介绍 正如我们上文中所描述的"|“无名管道提供了具有亲缘关系的进程之间的通信,它由于直接使用系统调用,运行效率较高。则linux系统下可以大批量的使用”|"来提供命令直接输入输出的重定向。 具体sh...