- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
选择高于 255 的 fds 不检查 fd 是否打开。这是我的示例代码:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/select.h>
int main()
{
fd_set set;
for(int i = 5;i<FD_SETSIZE;i++)
{
printf("--> i is %d\n", i);
FD_ZERO(&set);
FD_SET(i, &set);
close(i);
int retval = select(FD_SETSIZE, &set, NULL, NULL, NULL);
if(-1 == retval)
{
perror("select");
}
}
}
这导致:
--> i is 5
select: Bad file descriptor
...
--> i is 255
select: Bad file descriptor
--> i is 256
然后应用程序阻塞。为什么这不会在 256 直到 FD_SETSIZE 上创建一个 EBADF
?
从评论中请求的信息:
prlimit
的结果是:
NOFILE max number of open files 1024 1048576
这是 strace ./test_select
的结果:
select(1024, [127], NULL, NULL, NULL) = -1 EBADF (Bad file descriptor)
dup(2) = 3
fcntl(3, F_GETFL) = 0x8402 (flags O_RDWR|O_APPEND|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
write(3, "select: Bad file descriptor\n", 28select: Bad file descriptor
) = 28
close(3) = 0
write(1, "--> i is 128\n", 13--> i is 128
) = 13
close(128) = -1 EBADF (Bad file descriptor)
select(1024, [128], NULL, NULL, NULL
从评论中揭穿想法:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/select.h>
#include <fcntl.h>
int main()
{
char filename[80];
int fd;
for(int i = 5;i<500;i++)
{
snprintf(filename, 80, "/tmp/file%d", i);
fd = open(filename, O_RDWR | O_APPEND | O_CREAT);
}
printf("--> fd is %d, FD_SETSIZE is %d\n", fd, FD_SETSIZE);
fd_set set;
FD_ZERO(&set);
FD_SET(fd, &set);
int retval = select(FD_SETSIZE, NULL, &set, NULL, NULL);
if(-1 == retval)
{
perror("select");
}
}
结果:
$ ./test_select
--> fd is 523, FD_SETSIZE is 1024
进程正常退出,无阻塞。
最佳答案
这里发生了一些非常奇怪的事情。您可能发现了 Linux 内核中的错误。
我修改了你的测试程序以使其更精确并且在遇到问题时不会卡住:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
int main(void)
{
fd_set set;
struct timeval tv;
int i;
for(i = 5; i < FD_SETSIZE; i++)
{
FD_ZERO(&set);
FD_SET(i, &set);
tv.tv_sec = 0;
tv.tv_usec = 1000;
close(i);
int retval = select(FD_SETSIZE, &set, 0, 0, &tv);
if (retval == -1 && errno == EBADF)
;
else
{
if (retval > 0)
printf("fd %d: select returned success (%d)\n", i, retval);
else if (retval == 0)
printf("fd %d: select timed out\n", i);
else
printf("fd %d: select failed (%d; %s)\n", i, retval, strerror(errno));
return 1;
}
}
return 0;
}
我对 POSIX 的理解是,无论 FD_SETSIZE
是什么,该程序都不应产生任何输出并成功退出。这就是它在 FreeBSD 11.1 和 NetBSD 7.1 上所做的(两者都运行在某种描述的 x86 处理器上)。但在 Linux(x86-64,内核 4.13)上,它会打印
fd 256: select timed out
退出失败。更奇怪的是,如果我在 strace
下运行相同的二进制文件,会改变输出:
$ strace -o /dev/null ./a.out
fd 64: select timed out
如果我在 gdb
下运行它,即使我没有告诉 gdb
做除了运行之外的任何事情,也会发生同样的事情程序。
Reading symbols from ./a.out...done.
(gdb) r
Starting program: /tmp/a.out
fd 64: select timed out
[Inferior 1 (process 8209) exited with code 01]
所以某些事情正在发生变化,因为该过程受到 ptrace
监控。这只能由内核引起。
我已经提交了 bug report on the Linux kernel并将报告他们对此的看法。
关于c - select 只检查 fds 直到 255 直到 FD_SETSIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47098097/
我需要从 1024 增加 FD_SETSIZE 值至 4096 .我知道最好使用 poll()/epoll()但我想了解什么是优点/缺点。主要问题是:我要重新编译glibc吗? ?我读了几个线程,其中
我遇到一个问题,即返回的文件描述符会逐渐增加到大于 FD_SETSIZE 的数字。 我的 tcp 服务器不断关闭,这需要我的客户端关闭套接字并重新连接。然后,客户端将尝试通过调用 socket 重新连
在服务器/客户端设置中,我有一个服务器通过少数(目前是 4 个)不同套接字与客户端连接。目前我使用带有计算 set_size 的 select,但是在值得使用 FD_SETSIZE 之前上限是多少?
我目前是 PHP 和 MySQL 的新手,但是,我正在尝试为 Club Penguin Emulator 运行 PHP 服务器代码,但是,随着越来越多的人加入并使加入变得异常困难,我没有运气由于 PH
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我想为我的系统增加 FD_SETSIZE 宏值。有什么办法可以增加 FD_SETSIZE 这样 select 就不会失败 最佳答案 根据标准,无法增加 FD_SETSIZE。一些程序和库(想到 lib
我们有一个使用 select() 设计的网络服务器,直到上周才真正看到太多负载,并且在我们的 500-1000 conn/s 负载下始终可以正常工作。然而,我们最近开始看到更高的负载(和尖峰)并遇到了
我编辑了 __FD_SETSIZE = 1024 到 4096: /usr/include/linux/posix_types.h /usr/include/x86_64-linux-gnu/bits
实际上,我尝试使用带有 java 的 bash 控制台在 opensuse 11 上启动 SIPP 3.3。当我用 开始 SIPP 时 proc = Runtime.getRuntime().exec
我是一名安卓程序员。 今天我运行一个 Android 应用程序时遇到了此类错误。 FORTIFY_SOURCE: FD_SET: file descriptor >= FD_SETSIZE. Call
我在新安装的 16"Macbook(带有 OSX 10.15.1 Catalina)上运行 MySQL@5.7 时遇到了一个大问题PDO::__construct():MySQL 服务器已经消失。 这
选择高于 255 的 fds 不检查 fd 是否打开。这是我的示例代码: #include #include #include #include int main() { fd_set
这些错误列表的含义是什么,更重要的是如何解决这些错误?如果有人也可以发表评论,那我应该期待什么可能的问题,这可能会促使我采取一些措施,因为我不清楚,因为我的应用程序正在运行并且显示正确 我发现了一个与
我是一名优秀的程序员,十分优秀!