yuesong-feng / 30dayMakeCppServer

30天自制C++服务器,包含教程和源代码

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Socket析构close(fd)返回-1

yeinan opened this issue · comments

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

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

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。