既然每次调用select都要重新构建套接字集合,有FD_ZERO就足够用了,为啥还有FD_CLR ?

时间:2022-09-03 00:26:33
既然每次调用select都要重新构建套接字集合,有FD_ZERO和FD_SET就足够用了,为什么还有FD_CLR ? 
FD_CLR什么情况下用?

15 个解决方案

#1


我当然知道FD_CLR 是从集合内清除某个描述符的,但不是问的这个啊。

#2


楼主真的不懂? 

增删改查初始化, 效率能一样吗?

clear了然后设置1万个,只为了取消那1个? 脑残?

#3


引用 2 楼 qq120848369 的回复:
楼主真的不懂? 

增删改查初始化, 效率能一样吗?

clear了然后设置1万个,只为了取消那1个? 

请看懂我问的是什么在回答好吗,select返回后会把以前加入的但并无事件发生的fd清空,FD_CLR只清掉集合中的一个描述符,除非所有fd都发生事件而没有被清空,这样后面用FD_CLR才有意义。否则,都要FD_ZERO然后FD_SET再逐个设置一遍。
所以我问是不是用到FD_CLR的情况不多,只有集合内所有fd都发生事了,才有可能用到?

#4


难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

#5


引用 4 楼 qq120848369 的回复:
难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

还有长久保存的一份?但是看这个文章也没有说长久保存的一份啊
http://hi.baidu.com/bimufo/item/139700e4d880cba1c00d755c

#6


引用 4 楼 qq120848369 的回复:
难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?


第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

#7


引用 6 楼 iw1210 的回复:
引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢


你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码。

#8


引用 7 楼 qq120848369 的回复:
引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码……


linux_c_py_php  是CSDN的大版主啊 既然每次调用select都要重新构建套接字集合,有FD_ZERO就足够用了,为啥还有FD_CLR ?

#9


引用 8 楼 iw1210 的回复:
引用 7 楼 qq120848369 的回复:引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的s……


水水就成版主了, 毫无意义.

#10


引用 7 楼 qq120848369 的回复:
引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码……


啊,明白了是用户自己备份了一份,以后只是赋值就行了,多谢提醒~

#11


引用 9 楼 qq120848369 的回复:
水水就成版主了, 毫无意义


版主谦虚了~,以后多向你学习

#12


引用 10 楼 iw1210 的回复:
引用 7 楼 qq120848369 的回复:引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的s……


就是一份fdset是一直保持着的,每次select之前拷贝一份给select用,这样删除添加事件都是操作前面那个fdset,后面的select完用完拉倒。

#13


引用 12 楼 qq120848369 的回复:
就是一份fdset是一直保持着的,每次select之前拷贝一份给select用,这样删除添加事件都是操作前面那个fdset,后面的select完用完拉倒。

是啊,明白了,谢谢~

#14


但是还有个问题,这样select的第一个参数每次都要重新判断一下啊

#15


#define CONN_MAXFD FD_SETSIZE
 stat=select(CONN_MAXFD+1,&rf,&wf,&ef,&tm);

    
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 
     
参数maxfd是需要监视的最大的文件描述符值+1,那个select代码里怎么是  FD_SETSIZE+1,FD_SETSIZE 一定不是用户的最大描述符的值吧?

#1


我当然知道FD_CLR 是从集合内清除某个描述符的,但不是问的这个啊。

#2


楼主真的不懂? 

增删改查初始化, 效率能一样吗?

clear了然后设置1万个,只为了取消那1个? 脑残?

#3


引用 2 楼 qq120848369 的回复:
楼主真的不懂? 

增删改查初始化, 效率能一样吗?

clear了然后设置1万个,只为了取消那1个? 

请看懂我问的是什么在回答好吗,select返回后会把以前加入的但并无事件发生的fd清空,FD_CLR只清掉集合中的一个描述符,除非所有fd都发生事件而没有被清空,这样后面用FD_CLR才有意义。否则,都要FD_ZERO然后FD_SET再逐个设置一遍。
所以我问是不是用到FD_CLR的情况不多,只有集合内所有fd都发生事了,才有可能用到?

#4


难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

#5


引用 4 楼 qq120848369 的回复:
难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

还有长久保存的一份?但是看这个文章也没有说长久保存的一份啊
http://hi.baidu.com/bimufo/item/139700e4d880cba1c00d755c

#6


引用 4 楼 qq120848369 的回复:
难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?


第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

#7


引用 6 楼 iw1210 的回复:
引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢


你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码。

#8


引用 7 楼 qq120848369 的回复:
引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码……


linux_c_py_php  是CSDN的大版主啊 既然每次调用select都要重新构建套接字集合,有FD_ZERO就足够用了,为啥还有FD_CLR ?

#9


引用 8 楼 iw1210 的回复:
引用 7 楼 qq120848369 的回复:引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的s……


水水就成版主了, 毫无意义.

#10


引用 7 楼 qq120848369 的回复:
引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的select.tar.gz,里面可以看到相关代码……


啊,明白了是用户自己备份了一份,以后只是赋值就行了,多谢提醒~

#11


引用 9 楼 qq120848369 的回复:
水水就成版主了, 毫无意义


版主谦虚了~,以后多向你学习

#12


引用 10 楼 iw1210 的回复:
引用 7 楼 qq120848369 的回复:引用 6 楼 iw1210 的回复:引用 4 楼 qq120848369 的回复:难道你不知道一份fdset是长久保存的,一份是复制前面那个fdset然后加入select的?

你操作的只是前面那一份,不懂?

第一次听说还有长久保存的一份,请给个这方面的资料链接看看,学习一下,谢谢

你看CU论坛里那位同学发的s……


就是一份fdset是一直保持着的,每次select之前拷贝一份给select用,这样删除添加事件都是操作前面那个fdset,后面的select完用完拉倒。

#13


引用 12 楼 qq120848369 的回复:
就是一份fdset是一直保持着的,每次select之前拷贝一份给select用,这样删除添加事件都是操作前面那个fdset,后面的select完用完拉倒。

是啊,明白了,谢谢~

#14


但是还有个问题,这样select的第一个参数每次都要重新判断一下啊

#15


#define CONN_MAXFD FD_SETSIZE
 stat=select(CONN_MAXFD+1,&rf,&wf,&ef,&tm);

    
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 
     
参数maxfd是需要监视的最大的文件描述符值+1,那个select代码里怎么是  FD_SETSIZE+1,FD_SETSIZE 一定不是用户的最大描述符的值吧?