FD_SET导致seg故障

时间:2013-12-16 18:37:43

标签: c++ multithreading boost segmentation-fault file-descriptor

我遇到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变量。

1 个答案:

答案 0 :(得分:3)

在1000个请求/秒时,您很有可能超过FD_SETSIZE限制(Linux上通常为1024),这会产生undefined behavior

  

fd_set 是固定大小的缓冲区。使用执行 FD_CLR() FD_SET()   fd的值为负或等于或大于    FD_SETSIZE 会导致未定义的行为。而且,POSIX需要   fd是一个有效的文件描述符。

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