服务器意外杀死子进程,客户再次访问的时候,会收到一个FIN,但是如果客户这时阻塞在某个功能上的时候,这个功能会意外终止.
问题在于,服务器意外杀死子进程,但是客户并不能及时收到FIN或者reset,导致客户等待,只有客户再次访问,才会发现服务器已经崩溃了.
sigpipe信号:
如果客户不理会这意外终止的功能,而向服务器发送更多的信息,会发生什么?
如果这个功能是写,那么内核会向这个进程发送一个SIGPIPE信号,也就是终止进程.所以进程必须捕获这个信号,以免被不情愿的终止.
服务器崩溃后重启:
假设客户在重启之前没有向服务器发送信息,也就不知道服务器崩溃,那么在重启后,服务器将对这些客户的tcp分节发送reset,因为服务器丢失了链接信息.
所以客户知道服务器是否崩溃很重要.
服务器关机:
关机的时候,Unix会给所有进程发送sigterm,然后隔一段时间发送sigkill,如果不能捕获sigterm,那么就会被sigkill杀死.
必须在客户使用poll或者select函数,使得客户知道服务器的终止.