关于对FD_SET类型的操作,有几个比较重要的宏:
FD_ZERO(*set) -- 将 set 的值清乾净
FD_SET(s, *set) -- 将 s 加到 set 中
FD_CLR(s, *set) -- 将 s 从 set 中删除
FD_ISSET(s, *set) -- 检查 s 是否存在於 set 中
参数 readfds、writefds、及 exceptfds 都是 「called by value-
result」;而「called by value-result」的意思就是说,我们在将参数传给系统
时,要先设启始值,并将这些参数的位址(address)告诉系统;而系统则会利
用到这些值来做些运算或其他用途,最后并将结果再写回这些参数的位址中。
因此这些参数的值在传入前和函数返回后,可能会不同;所以每次调用
select() 前,对这些参数一定要重新设定它们的值。