Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Socket析构close(fd)返回-1 #37

Open
yeinan opened this issue Oct 29, 2022 · 2 comments
Open

Socket析构close(fd)返回-1 #37

yeinan opened this issue Oct 29, 2022 · 2 comments

Comments

@yeinan
Copy link

yeinan commented Oct 29, 2022

我尝试打印出socket析构时候close(fd)的结果,发现它总是返回-1。
然后我在connection 读取缓冲区完毕后close(fd),这里就返回0正常关闭了套接字。

然后有时我还会遇到epoll add error: bad file descriptor的问题,这也许也和之前没有close有关吗?

@yuesong-feng
Copy link
Owner

close(fd)返回-1有以下几种情况,可以根据errno来判断:
EBADF:fd不是一个有效的、开启的文件描述符
EINTR:close()被一个信号中断了
EIO:发生了一个IO错误
ENOSPC, EDQUOT:在NFS文件系统中,第一次写入超过了可用的存储空间大小并不会发生,但后续的write()、fsync()或close()会发生。

绝大部分情况应该是EBADF,当你close(fd)的时候,它已经是一个失效的fd了。
这可能是fd在之前某个时候从epoll上被移除,因为从epoll上移除会自动调用close()来关闭文件描述符。

epoll add error: bad file descriptor和close没有关系,close掉的fd不会被加入到epoll,可能是加入的fd已经被关闭、或者是一个无效fd。

@yeinan
Copy link
Author

yeinan commented Nov 7, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants