linux的檔案描述符集fd_set的實現方式
阿新 • • 發佈:2019-01-24
通過賦值語句可以在兩個檔案描述符集之間進行賦值,例如可以這樣寫:
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