我遇到FD_SET
崩溃我的程序的问题。我正在使用boost Boost ASIO sample HTTP Server运行示例代码。在请求处理程序中,我将第三方api最终进行以下调用:
fd_set fds;
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
我的程序似乎在FD_SET
上崩溃了。是否存在从不同线程调用FD_SET
会导致段错误的情况?我不确定FD_SET
究竟是如何运作的,我的直觉是我在已经使用的fd上调用FD_SET
。这会导致问题吗?
sockfd
是一个类成员,每次请求进入时都会创建,所以我不应该在线程之间共享sockfd
变量。
答案 0 :(得分:3)
在1000个请求/秒时,您很有可能超过FD_SETSIZE
限制(Linux上通常为1024),这会产生undefined behavior:
fd_set 是固定大小的缓冲区。使用执行 FD_CLR()或 FD_SET() fd的值为负或等于或大于 FD_SETSIZE 会导致未定义的行为。而且,POSIX需要 fd是一个有效的文件描述符。
您应该考虑使用poll
,epoll
或更高级别的库,例如Boost Asio。任何这些选择都不会受select
的限制。