C++ FD_设置导致seg故障
我遇到了一个问题,C++ FD_设置导致seg故障,c++,multithreading,boost,segmentation-fault,file-descriptor,C++,Multithreading,Boost,Segmentation Fault,File Descriptor,我遇到了一个问题,FD\u SET正在使我的程序崩溃。我正在运行来自boost的示例代码。在请求处理程序中,我放置了一个第三方api,该api最终进行以下调用: fd_set fds; FD_ZERO(&fds); FD_SET(sockfd, &fds); 我的程序似乎在FD\u集上崩溃。是否存在从不同线程调用FD_SET会导致segfault的情况?我不确定FD_集到底是如何工作的,我的直觉是我正在使用的FD上调用FD_集。这会不会造成问题 sockfd是一个类成员,每次
FD\u SET
正在使我的程序崩溃。我正在运行来自boost的示例代码。在请求处理程序中,我放置了一个第三方api,该api最终进行以下调用:
fd_set fds;
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
我的程序似乎在FD\u集
上崩溃。是否存在从不同线程调用FD_SET
会导致segfault的情况?我不确定FD_集
到底是如何工作的,我的直觉是我正在使用的FD上调用FD_集
。这会不会造成问题
sockfd
是一个类成员,每次请求传入时都会创建它,因此我不应该在线程之间共享sockfd
变量。在每秒1000个请求时,您很可能会超过FD\u SETSIZE
限制(在Linux上通常是1024个),这会导致:
fd_集是一个固定大小的缓冲区。使用
fd的负值或等于或大于
FD_SETSIZE将导致未定义的行为。此外,POSIX需要
fd必须是有效的文件描述符
您应该考虑使用或更高级别的库,如。这些选择中的任何一个都没有
select
的限制,在每秒1000个请求时,您很可能会超过FD_SETSIZE
限制(在Linux上通常是1024个),这会导致:
fd_集是一个固定大小的缓冲区。使用
fd的负值或等于或大于
FD_SETSIZE将导致未定义的行为。此外,POSIX需要
fd必须是有效的文件描述符
您应该考虑使用或更高级别的库,如。这些选择中的任何一个都不受
select
的限制,您所说的“看起来像”是什么意思?你不能使用调试器来确定吗?你检查过sockfd
是正数,并且小于FD_SETSIZE
?FD_SET()
实际上只是在无符号整数数组中设置了一位。使用上述代码,FD_SET
失败或弄糟事情的最可能原因是sockfd
超出范围,例如。,因为它无效,或者因为可用套接字的系统参数大于fd_set
中的可用位。问题是增加系统上可用文件描述符的数量不会改变实现这些类的C库。理想情况下,您应该将代码更改为与相对低效的select()
不同的代码,以使用poll()
或epoll()
。您的问题是,一旦超过FD_SETSIZE
,正在设置的位就在不相关的内存中的某个地方,这只是缓冲区溢出的一种形式。@Eumcoz:您可以使用poll
或epoll
,或者通过Boost库在更高级别上工作。我不知道是否有任何方法可以增加FD_SETSIZE
,因为我自己不必为选择而烦恼。你说的“看起来像”是什么意思?你不能使用调试器来确定吗?你检查过sockfd
是正数,并且小于FD_SETSIZE
?FD_SET()
实际上只是在无符号整数数组中设置了一位。使用上述代码,FD_SET
失败或弄糟事情的最可能原因是sockfd
超出范围,例如。,因为它无效,或者因为可用套接字的系统参数大于fd_set
中的可用位。问题是增加系统上可用文件描述符的数量不会改变实现这些类的C库。理想情况下,您应该将代码更改为与相对低效的select()
不同的代码,以使用poll()
或epoll()
。您的问题是,一旦超过FD_SETSIZE
,正在设置的位就在不相关的内存中的某个地方,这只是缓冲区溢出的一种形式。@Eumcoz:您可以使用poll
或epoll
,或者通过Boost库在更高级别上工作。我不知道是否有任何方法可以增加FD_SETSIZE
,因为我自己不必为选择而烦恼。