accept 文件描述符用尽处理

时间:2023-03-09 05:07:20
accept 文件描述符用尽处理
 if (events[i].data.fd == listenfd)
{
peerlen = sizeof(peeraddr);
connfd = ::accept4(listenfd, (struct sockaddr*)&peeraddr,
&peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC); if (connfd == -1)//函数发生错误
{
if (errno == EMFILE)//表示每个进程允许打开的文件描述符数量最大值已经到达
{//遇到这种情况的解决方法是
/*
准备一个空闲的文件描述符。遇到这种情况,先关闭这个空闲文件,
获得一个文件描述符名额;再accept(2)拿到socket连接的文件描述符;随后立刻close(2),
这样就优雅地断开了与客户端的连接;
最后重新打开空闲文件,把“坑”填上,以备再次出现这种情况时使用
*/ close(idlefd);
idlefd = accept(listenfd, NULL, NULL);
close(idlefd);
idlefd = open("/dev/null", O_RDONLY | O_CLOEXEC);
continue;
}
else
ERR_EXIT("accept4");
}

相关文章