gpt4 book ai didi

c - 我应该在 select() EBADF 上断言失败吗?

转载 作者:可可西里 更新时间:2023-11-01 02:44:19 24 4
gpt4 key购买 nike

我正在尝试修复调用 select() 的事件循环中的错误。当 select() 返回 EBADF 时,会记录一个错误,然后重新初始化 fd 集并再次调用 select。这会导致日志记录的无限硬循环,在几秒钟内生成千兆字节的日志。

如果我的程序连接到的其中一个 tcp 服务器发生不正常的断开连接(例如,它出现段错误),则会发生此错误。在这种情况下,理想情况下我希望我的程序删除该 fd 并继续运行(如果不可行则关闭)。

我的问题是,select() 应该返回 EBADF,还是表明我的程序有问题? IE。我应该在 EBADF 上断言失败,否则我应该如何处理它?我会循环遍历 fd 集以找到“坏”文件描述符吗?

最佳答案

您的代码中有错误。修理它。在某个地方,您正在关闭一个套接字,而没有将其从选择器使用的 FD 集中删除。或者您刚刚编写了一个不是 FD 的 FD,并在 FD 集中使用它。

与此处的其他陈述相反,网络问题不会导致此错误。网络中断不会关闭套接字,这是它们变为无效的唯一方式。只有关闭它们才能做到这一点。如果您继续写入,连接不工作的套接字最终将导致 ECONNRESET。对端已断开连接的套接字将变得可读,并且其上的 recv() 将返回零。

关于c - 我应该在 select() EBADF 上断言失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com