1. 程式人生 > >linux的檔案描述符集fd_set的實現方式

linux的檔案描述符集fd_set的實現方式

通過賦值語句可以在兩個檔案描述符集之間進行賦值,例如可以這樣寫:

fd_set readset,tmpset;  
FD_ZERO(&readset);  
FD_ZERO(&tmpset);  
FD_SET(listener,&tmpset);  
readset=tmpset;  
select(maxfd+1,&readset,NULL,NULL);  
那麼顯而易見,fd_set的實現方式不可能是簡單的整形陣列,因為對陣列進行賦值是非法的。 
看了一下<select.h>中fd_set的定義:
typedef struct  
  {  
    /* XPG4.2 requires this member name.  Otherwise avoid the name 
       from the global namespace.  */  
#ifdef __USE_XOPEN  
    __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];  
# define __FDS_BITS(set) ((set)->fds_bits)  
#else  
    __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS];  
# define __FDS_BITS(set) ((set)->__fds_bits)  
#endif  
  } fd_set; 

這裡__fd_mask是long型別 。可以看到,儲存描述符的容器確實是陣列(fds_bits[ ]),但是它被包在結構體之內。而對於兩個結構體進行賦值時,C語言會自動幫我們完成深拷貝。如下:
typedef struct  
{  
    int a[3];  
}fdset;  
    fdset readset;  
    readset.a[0]=100;  
    fdset writeset;  
    writeset=readset;  
    readset.a[0]=200;  
    cout<<writeset.a[0]<<endl;//輸出100  
    cout<<readset.a[0]<<endl;//輸出200