当一个套接字上发生错误时,内核协议中的协议模块将此套接字的名为so_error的变量设为标准的Unix Exxx值中的一个,我们称它为该套接字的待处理错误(pending error)。
内核能够以下面两种方式之一立即通知进程这个错误。
- 如果进程阻塞在对该套接字的select调用上,那么无论是检查可读条件还是可写条件,select均返回并设置其中一个或所有两个条件。
- 如果进程使用信号驱动式I/O模型,那就给进程或进程组产生一个SIGIO信号。
进程然后可以通过访问SO_ERROR套接字选项获取so_error的值。由getsockopt返回的整数值就是该套接字的待处理错误。so_error随后由内核复位为0。
当进程调用read且没有数据返回时,如果so_error为非0值,那么read返回-1且errno被置为so_error的值。so_error随后被复位为0。如果该套接字上有数据在排队等待读取,那么read返回那些数据而不是返回错误条件。
如果在进程调用write时so_error为非0值,那么write返回-1且errno被设为so_error的值。so_error随后被复位为0。
这是我们遇到的第一个可以获取但不能设置的套接字选项。