我遇到一个问题,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必须是有效的文件描述符。
您应该考虑使用poll
、epoll
或更高级别的库,如Boost Asio。这些选择中的任何一个都不受select
的限制。