2013-12-16 124 views
1

我遇到了一个问题,其中FD_SET正在崩溃我的程序。我正在运行提升Boost ASIO sample HTTP Server的示例代码。在请求处理程序中,我把第三方的API最终做出以下电话:FD_SET导致seg故障

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

我的程序似乎是在FD_SET崩溃。是否有从不同线程调用FD_SET会导致段错误的情况?我不确定FD_SET是如何工作的,我的直觉就是我在已经使用的fd上打电话FD_SET。这会导致问题吗?

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

+0

你是什么意思“似乎”?你不能使用调试器来确认吗? – 2013-12-16 18:41:30

+1

你是否检查过'sockfd'是肯定的,并且少于'FD_SETSIZE'? –

+0

它不会每一次都崩溃,只有当我的服务器运行在1000请求/秒左右时才会崩溃。我所拥有的只是一个回溯,这并没有给我准确的界限。当我注释掉代码+代码后,程序将运行正常。一旦那条线在那里,程序崩溃。 – Eumcoz

回答

3

在1000个请求/秒你很可能在黯然失色的undefined behavior限制FD_SETSIZE(通常在Linux 1024),这导致:

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

你应该看看使用pollepoll,或更高级别的图书馆像Boost Asio。任何这些选择都不会有select的限制。