Ошибка сломанной трубы - PullRequest
       9

Ошибка сломанной трубы

1 голос
/ 12 августа 2010

Я использую write () в открытом сокете данных в реализации FTP для отправки файла.Но после записи некоторых данных они на некоторое время зависают;и после этого он возвращается с ошибкой сломанной трубы.любая помощь в этом будет принята с благодарностью.Мой процесс читает пакеты из одного буфера и записывает в сокет.Я заметил эту проблему с увеличением пропускной способности.Если я увеличил количество пакетов для обработки, то проблема приближается.Я использую FreeBSD.

Я использую два потока, один читает пакеты и записывает их в буфер ... Второй поток читает эти пакеты из буфера и записывает их в сокет.

Спасибо за вашпомогите Александру

Ответы [ 2 ]

4 голосов
/ 12 августа 2010

SIGPIPE отправляется вашему процессу ядром при обнаружении попытки записи данных в сломанный канал.Это может произойти, например, если принимающая сторона закрыла сокет во время записи, или если сокет был случайно закрыт из другого потока и т. Д. Существует множество возможных причин для этого.Большинство приложений склонны игнорировать этот сигнал и обрабатывать ошибки, основываясь на коде возврата « write », потому что нет ничего разумного, что можно сделать в обработчике обработки сигнала SIGPIPE .По сути, установите обработчик SIGPIPE в SIG_IGN, чтобы проигнорировать его и посмотреть список возможных кодов возврата из системного вызова " write " и обработать их соответствующим образом.

3 голосов
/ 12 августа 2010

EPIPE может быть установлен как код ошибки и / или SIGPIPE повышен (в зависимости от флагов), когда вы пытаетесь записать в закрытый дескриптор файла.Вполне вероятно, что удаленная конечная точка вашего соединения закрылась, и вы не проверили наличие события close / EOF (обычно возвращается через событие чтения при poll / select ing или возвращаемое значение ноль от read / recv).

...