user-0 提问: FD_ISSET究竟是怎么工作的&&socket描述符为什么会发生变化？

回复:
user: user-0
content: 引用 7 楼 qybao 的回复:不是不置0，是你打印得不对 fd_set是个结构体，里面有数组，被你当长整形打印了，打印出地址信息了。 你要自己写个函数显示read_set的内存信息而不是转成长整形 其实我也很纳闷，我知道是个结构体，但是我之前在百度看到说可以作为ld，我就按这个打印的，一直感觉很奇怪。而且，除了这个read_set, 其他的都置0了啊，这是怎么回事，碰巧吗？  然后我刚刚按照这个定义写，我看它内部成员应该就是fds_bits  #define __FD_SET(fd, fdsetp)   (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31)))  想打印 (fd_set *)(fdsetp))->fds_bits[x] （其实我也还不知道打印哪一位。。） gcc会报错说没有fds_bits这个成员，我该怎么打印它啊？

user: user-1
content: 不是不置0，是你打印得不对 fd_set是个结构体，里面有数组，被你当长整形打印了，打印出地址信息了。 你要自己写个函数显示read_set的内存信息而不是转成长整形

user: user-0
content: 引用 5 楼 qybao 的回复:服了你了，sock_fd哪变化了？，是你自己少打了一个参数 为了确认，我还特意把你的代码复制运行了一遍 printf("222 sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);    printf("PPP sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);  socket值是随机的，尤其是客户端，每次生成socket的端口也是随机的 ....对不起，我傻了。。。 我还有两个问题，方便说一下嘛  after FD_ZERO, read_set is 36904976, write_set is 0, select_read_set is 0 111 sock_fd is -1, read_set is 16, write_set is 2147483574, select_read_set is 0 sock_fd is 3 222 sock_fd is 3, read_set is 139845989938512, write_set is -104, select_read_set is 1844674407370955161 333 sock_fd is 3, read_set is 2, write_set is 139845989365066, select_read_set is 4 PPP sock_fd is 3, read_set is 16, write_set is 139845989364247, select_read_set is 0 QQQ sock_fd is 3, read_set is 8, write_set is 3, select_read_set is 0  1.  read_set 怎么就置不了0？ 我就只把这块拉过来      fd_set read_set; 	fd_set write_set; 	fd_set select_read_set;   	FD_ZERO(&read_set); 	FD_ZERO(&write_set); 	FD_ZERO(&select_read_set); 	printf("after FD_ZERO, read_set is %ld, write_set is %ld, select_read_set is %ld\n", read_set, write_set, select_read_set);  跑出来的结果就会是这样after FD_ZERO, read_set is 140734867392568, write_set is 0, select_read_set is 0。 怎么没置0啊？ 2. 还是回到上面的问题，'write_set' 'select_read_set', 我根本没操作，怎么也发生变化了。  你跑出来的结果是怎么样的，我就很费解我明明没操作，怎么就值改变了。

user: user-1
content: 服了你了，sock_fd哪变化了？，是你自己少打了一个参数 为了确认，我还特意把你的代码复制运行了一遍 printf("222 sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);  printf("PPP sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);  socket值是随机的，尤其是客户端，每次生成socket的端口也是随机的

user: user-0
content: 引用 3 楼 qybao 的回复:FD_ISSET是怎么判断吧，你去看看它的源码吧 #define __FD_ISSET(d, set)  ((__FDS_BITS (set)[__FD_ELT (d)] & __FD_MASK (d)) != 0) 源码里有各个宏的定义 http://www.pandademo.com/2016/11/linux-kernel-select-source-dissect/ 多谢，那我代码那个操作符莫名变化那个问题，你知道是为什么吗？我在置0之后，直到FD_SET并没有对其进行任何操作(甚至write_set select_read_set根本没操作)，不应该变化啊。我应该是犯了一些很基本的错误，但我却不知道哪里有问题。

user: user-1
content: FD_ISSET是怎么判断吧，你去看看它的源码吧 #define __FD_ISSET(d, set)  ((__FDS_BITS (set)[__FD_ELT (d)] & __FD_MASK (d)) != 0) 源码里有各个宏的定义 http://www.pandademo.com/2016/11/linux-kernel-select-source-dissect/

user: user-0
content: 引用 1 楼 user-2 的回复:把 -1 set 上去有点看不懂啊，fd_set 本质是位图，set 就是将对应位置1，clear 是置0，socket() 函数当前进程可以使用的最小文件描述符 那个-1随便循环的，不要care。。 set是置1本来是很明确的，可是在第二个程序那边，很奇怪，看这个打印的 PPP sock_fd is 20, read_set is 16, write_set is 140083557847575, select is 0 QQQ sock_fd is 0, read_set is 8, write_set is 3, select is 0 中间是格了一个FD_SET， 首先按道理，sock_fd不应该变化，可是变化了，从20变成了0，read_set是被FD_SET操作的，暂且不说sock_fd咋变成的20又变成了0 对sock_fd=20或者0，read_set不应该是8，这应该不是FD_SET搞的鬼，可我想不明白是怎么回事。 而且write_set select_read_set根本没操作，也变化了，感觉很奇怪。

user: user-2
content: 把 -1 set 上去有点看不懂啊，fd_set 本质是位图，set 就是将对应位置1，clear 是置0，socket() 函数当前进程可以使用的最小文件描述符