Допустим, у меня есть модель клиента и сервера, связывающаяся друг с другом, и epoll настроен на стороне сервера для пробуждения при EPOLLIN
и EPOLLOUT
. Насколько я понимаю, изменение доступности клиентского конца сокета для чтения / записи вызовет событие epoll для запуска на сервере. Скажем, я делаю половину выключения на клиенте, поэтому я выключаю завершение записи клиента. Затем, как и ожидалось, я получаю событие EPOLLIN
на стороне сервера. Однако теперь, скажем, я закрываю конец чтения сокета. epoll_wait
не просыпается после этого. Я мог подумать, что, возможно, происходит то, что, как только конец записи клиента закрывается, он не может отправить на сервер уведомление о том, что он закрывает конец чтения. С другой стороны, я думал, что наличие EPOLLOUT
сообщит мне о любых изменениях в состоянии конца чтения клиента / конца записи сервера, но это не так.
Я знаю, что мог бы проверить наличие сбоя записи / SIGPIPE, чтобы увидеть, завершил ли клиент завершение чтения, но мне более любопытно, является ли это ожидаемым поведением или проблемой с моим кодом, и если это ожидается, почему это так?