我在Linux主机(RHEL 6.6)上运行了许多C程序。它们与同一主机上的其他应用程序具有TCP / IP连接。每个连接的流量都很小。每隔一段时间,对同一主机上的进程的一个套接字上的read()调用返回0.这些套接字通常在应用程序的生命周期内保持运行,因此在正常操作期间它们不会完全关闭。我希望如果发生错误,例如另一端崩溃,read()将返回-1并设置errno。
所以,问题是 - 除了TCP / IP连接被另一端干净地关闭(shutdown(fd); close(fd))之外还有什么原因导致read()调用返回0?
read()的手册页指出0仅返回EOF,而recv()手册页指出它返回" 0当对等点执行了有序关闭"。我假设read()和recv()的返回是等效的,TCP / IP连接上的EOF意味着干净关闭。
答案 0 :(得分:3)
所以,问题是 - 除了TCP / IP之外还有其他任何原因 连接被另一个干净地关闭(shutdown(fd); close(fd)) 结束会导致read()调用返回0
对于初学者来说,进程死亡会释放出具有相同效果的文件描述符:一个干净的连接关闭。
我希望如果发生错误,例如另一端崩溃, read()将返回-1并设置errno。
这取决于你的意思"崩溃"。如果该过程例如死亡但操作系统仍然正常,那么就TCP而言,一切正常,它可以关闭现在孤立的套接字的连接(换句话说就像上面一样)。
旁注:当然,recv
可能会因为行为不端的对等体而返回-1
的方式(例如,对等方可以强制重置TCP)。