Какая лучшая практика для предотвращения аварии здесь?
Либо отключите sigpipes для всех, либо поймайте и игнорируйте ошибку.
Есть ли способ проверить, читает ли другая сторона строки?
Да, используйте select ().
select () здесь не работает, так как всегда говорит, что сокет доступен для записи.
Вам нужно выбрать на чтение бит. Вы, вероятно, можете игнорировать запись битов.
Когда дальний конец закроет свой дескриптор файла, select скажет вам, что есть данные, готовые для чтения. Когда вы пойдете и прочитаете это, вы получите обратно 0 байтов, и именно так ОС сообщает вам, что дескриптор файла закрыт.
Единственный раз, когда вы не можете игнорировать биты записи, это если вы отправляете большие тома, и существует риск того, что другой конец будет заблокирован, что может привести к заполнению ваших буферов. Если это произойдет, то попытка записи в дескриптор файла может привести к блокировке или неудаче вашей программы / потока. Тестирование select перед записью защитит вас от этого, но не гарантирует, что другой конец исправен или что ваши данные будут доставлены.
Обратите внимание, что вы можете получить sigpipe из close (), а также когда вы пишете.
Close сбрасывает любые буферизованные данные. Если другой конец уже был закрыт, то закрыть не удастся, и вы получите sigpipe.
Если вы используете буферизованный TCPIP, то успешная запись означает, что ваши данные были поставлены в очередь для отправки, но это не значит, что они были отправлены. Пока вы успешно не позвоните близко, вы не знаете, что ваши данные были отправлены.
Sigpipe говорит вам, что что-то пошло не так, не говорит вам, что или что вы должны с этим делать.