当前位置:  开发笔记 > 运维 > 正文

c中有刺激性的select()行为

如何解决《c中有刺激性的select()行为》经验,为你挑选了2个好方法。

select修改其参数.你真的必须每次都重新初始化它.

如果您担心开销,那么在内核中处理完整FD_SET的成本比FD_ZERO的成本更重要.您只想传递最大fd,而不是FD_SETSZIZE,以最小化内核处理.在你的例子中:

switch (select((sd + 1),&set,NULL,NULL,&timeout))

对于具有多个fds的更复杂的情况,通常最终会维护一个max变量:

FD_SET(sd,&set);
if (sd > max) max = sd;
... repeat many times...

switch (select((max + 1),&set,NULL,NULL,&timeout))


如果你有大量的文件描述符,并且担心将它们包含在内,那么你应该看看select()的一些替代方法.你没有提到你正在使用的操作系统,但对于类Unix操作系统,有一些:

对于Linux,epoll()

对于FreeBSD/NetBSD/OpenBSD/MacOS X,kqueue()

对于Solaris,/ dev/poll

API是不同的,但它们本质上都是一个有状态的内核接口,用于维护一组活动文件描述.将fd添加到集合后,您将收到有关该fd事件的通知,而无需再次将其连续传递.



1> DGentry..:

select修改其参数.你真的必须每次都重新初始化它.

如果您担心开销,那么在内核中处理完整FD_SET的成本比FD_ZERO的成本更重要.您只想传递最大fd,而不是FD_SETSZIZE,以最小化内核处理.在你的例子中:

switch (select((sd + 1),&set,NULL,NULL,&timeout))

对于具有多个fds的更复杂的情况,通常最终会维护一个max变量:

FD_SET(sd,&set);
if (sd > max) max = sd;
... repeat many times...

switch (select((max + 1),&set,NULL,NULL,&timeout))


如果你有大量的文件描述符,并且担心将它们包含在内,那么你应该看看select()的一些替代方法.你没有提到你正在使用的操作系统,但对于类Unix操作系统,有一些:

对于Linux,epoll()

对于FreeBSD/NetBSD/OpenBSD/MacOS X,kqueue()

对于Solaris,/ dev/poll

API是不同的,但它们本质上都是一个有状态的内核接口,用于维护一组活动文件描述.将fd添加到集合后,您将收到有关该fd事件的通知,而无需再次将其连续传递.



2> Greg Rogers..:

阅读选择手册页.返回的集合只是可以使用的文件描述符.您应该使用FD_ISSET检查每个是否已设置.

始终在使用前初始化fd_set.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有