FD_SET导致seg故障



我遇到一个问题,FD_SET正在崩溃我的程序。我正在运行boost boost ASIO示例HTTP服务器的示例代码。在请求处理程序中,我放置了一个第三方api,最终进行以下调用:

fd_set fds; 
FD_ZERO(&fds);
FD_SET(sockfd, &fds);

我的程序似乎在FD_SET上崩溃了。是否存在从不同线程调用FD_SET会导致segfault的情况?我不确定FD_SET到底是如何工作的,我的直觉是,我在一个已经在使用的fd上调用FD_SET。这会造成问题吗?

sockfd是一个类成员,每次收到请求时都会创建它,所以我不应该在线程之间共享sockfd变量。

在每秒1000个请求的情况下,您很可能会超过FD_SETSIZE的限制(在Linux上通常为1024),这会导致未定义的行为:

fd_set是一个固定大小的缓冲区。使用执行FD_CLR()FD_SET()d的值为负数或等于或大于FD_SETSIZE将导致未定义的行为。此外,POSIX要求fd必须是有效的文件描述符。

您应该考虑使用pollepoll或更高级别的库,如Boost Asio。这些选择中的任何一个都不受select的限制。

相关内容

  • 没有找到相关文章

最新更新