12

Я получил ошибку "сломанной трубы" от XCode один раз слишком много. Теперь мне интересно узнать, что такое труба.

Что такое понятие "труба" и как ее можно "сломать"?

5 ответов5

7

Канал - это просто механизм межпроцессного взаимодействия (IPC), используемый для подключения стандартного выхода одного процесса к стандартному входу другого.

Например, когда вы хотите найти в файле слово "pax":

cat filename | grep pax

и да, я знаю, что вы можете получить файл grep напрямую, но это не объясняет, как он работает, не так ли?

Это соединяет стандартный вывод команды cat со стандартным вводом команды grep . cat отправляет содержимое файла на его стандартный вывод, а grep читает его файл (в данном случае) из его стандартного ввода. Соединяя процессы вместе, как это, вы можете создавать свои собственные инструменты, состоящие из любого количества сегментов трубы. Вещи как:

show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20

Разорванный канал - это тот, где (обычно) получатель данных закрыл соединение, в то время как отправитель все еще пытается отправить сообщение.

Например, если вы отправляете большой файл через программу-пейджер (чтобы просмотреть его по одной странице за раз):

cat myfile | pager

а затем выполните CTRL-BREAK, это может привести к тому, что процесс pager закроет свой входной канал до того, как cat завершит его использование. Это одна возможность получить эту сломанную трубу.


В результате краткого поиска в Google эта конкретная проблема, по-видимому, связана со специальными развертываниями, и в число предлагаемых решений обычно входит выход из большинства вашего программного обеспечения и перезагрузка большинства ваших устройств.

Это, вероятно, достаточно серьезно, чтобы сообщить об этой проблеме Apple. Чем больше разработчиков жалуются на это, тем больше вероятность, что что-то будет сделано, чтобы это исправить.

2

| персонаж часто называют трубкой. В различных оболочках UNIX (о которых я знаю) его можно использовать для передачи вывода одной команды на вход другой.

cat myfile.txt | head

Команда head показывает только первые несколько строк своего ввода. В этот момент он закрывает свой вход. Это создает проблему для команды, которая генерировала ввод. Куда это пишет? Всякий раз, когда мы сталкиваемся с такой ситуацией или ситуацией, когда процесс записи заканчивается до того, как читатель закончил, это называется "сломанной трубой".

Чтобы команда cat сохранялась вечно, стандарт UNIX определяет специальный сигнал (SIGPIPE, сигнал 13), который он отправляет в cat . Действие по умолчанию для этого сигнала - убить процесс, что хорошо завершает работу cat .

Похоже, что приложение, которое вы используете, установило обработчик сигналов для всех сигналов, включая SIGPIPE, который создает небольшое всплывающее сообщение, которое вы видите.

1

Эта ошибка, кажется, появляется довольно часто. https://stackoverflow.com/questions/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe it "... внутренняя ошибка в способности Xcode общаться с вашим телефоном. Это не значит, что вы сделали что-то не так, это ошибка в системе разработки "

1

Канал - это механизм IPC в системах Unix. Канал имеет два конца: конец чтения и конец записи. Данные, которые записываются в конец записи, могут быть прочитаны из конца чтения и выводятся в том порядке, в котором они были записаны.

В мире командной строки Unix каналы являются очень распространенным способом соединения программ для выполнения работы. Например, sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz' прочитает в файле fred.txt заменит все вхождения строки foo строкой bar затем найдет в результатах строки, содержащие bar за которыми следует некоторое количество символов, затем baz .

Это, конечно, не кажется очень полезным. Но я уверен, что если вы подумаете об этом, вы увидите, как вы могли бы использовать это для всех видов интересного использования, особенно если в вашем распоряжении такие программы, как awk или perl .

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

Обработка SIGPIPE умолчанию убивает процесс, который его получает. И если это не «голова» конвейера, вся вещь SIGPIPE распространяется обратно по цепочке.

Xcode жалуется на то, что он запустил какую-то подпрограмму, чтобы сделать что-то с ведущим к нему каналом, и эта подпрограмма неожиданно умерла, оставив трубу сломанной.

0

«Разорванный» канал - это канал, в котором один конец был close() , а другой читается или записывается. Например, в следующей команде оболочки:

cat foo | less

Процесс cat удерживает записывающий конец канала, а less - зачитывающий. Если процесс чтения закрывает трубу, труба сломана (и поэтому бесполезна); процесс записи получит ошибку «сломанный канал» от операционной системы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .