| Предыдущий | Следующий |
| EMLINK | EDOM |
EPIPE
EPIPE возникает, когда программа пытается записать в ориентированный на соединение сокет, чей путь отправки больше непригоден. Удалённая сторона могла закрыть соединение, локальный код уже мог вызвать shutdown(..., SHUT_WR), либо транспорт обнаружил разрыв сеанса. Нельзя считать данные неудачной записи доставленными.
В Linux отправка, вернувшая EPIPE, может дополнительно породить SIGPIPE. Если процесс специально не обрабатывает и не подавляет этот сигнал, действие по умолчанию способно завершить процесс раньше обычной обработки ошибки. Linux предоставляет MSG_NOSIGNAL для отдельного вызова send; политикой SIGPIPE можно управлять и на уровне процесса или потока, но глобальное изменение затрагивает больше кода.
Рекомендуемая обработка
- Прекратите использовать сокет, удалите его из пула соединений и создайте новое соединение для безопасного повтора.
- Отслеживайте подтверждения прикладного протокола: запрос мог дойти до другой стороны до того, как разрыв стал заметен.
- Запишите, последовал ли отказ за локальным shutdown, закрытием удалённой стороны, reset или записью после длительного простоя.
Linux send(2) и MSG_NOSIGNAL · POSIX sendmsg() · Руководство Linux: socket(2)
Нужно найти другой код? Найти другой код состояния или ошибки.