Я получил ошибку "сломанной трубы" от XCode один раз слишком много. Мне теперь интересно узнать, что такое труба.
Что такое понятие «труба» и как ее можно «сломать»?
Я получил ошибку "сломанной трубы" от XCode один раз слишком много. Мне теперь интересно узнать, что такое труба.
Что такое понятие «труба» и как ее можно «сломать»?
Ответы:
Канал - это просто механизм межпроцессного взаимодействия (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
и затем выполните a CTRL-BREAK, это может привести к тому, что pager
процесс завершит свою входную трубу до того, cat
как завершит его использование. Это одна возможность получить эту сломанную трубу.
В результате краткого поиска в Google эта конкретная проблема, по-видимому, связана со специальными развертываниями, и в число предлагаемых решений обычно входит выход из большинства программного обеспечения и перезагрузка большинства ваших устройств.
Это, вероятно, достаточно серьезно, чтобы сообщить об этой проблеме Apple. Чем больше разработчиков жалуются на это, тем больше вероятность, что что-то будет сделано, чтобы это исправить.
pr -e4 -n ten-thousand-lines.c | sed 10q
заканчивается сломанной трубой. pr
Потрудитесь ли сказать вам, что он получил сигнал SIGPIPE - другое дело; он может просто выйти в результате сигнала (генерируя ненулевой статус выхода).
|
Характер часто называют трубами. В различных оболочках UNIX (о которых я знаю) его можно использовать для передачи вывода одной команды на вход другой.
cat myfile.txt | head
Команда head
показывает только первые несколько строк своего ввода. В этот момент он закрывает свой вход. Это создает проблему для команды, которая генерировала ввод. Куда это пишет? Всякий раз, когда у нас возникает такая ситуация или ситуация, когда процесс записи заканчивается до того, как читатель закончил, это называется «сломанной трубой».
Чтобы cat
команда не задерживалась вечно, стандарт UNIX определяет специальный сигнал ( SIGPIPE , сигнал 13 ), который она отправляет cat
. Действие по умолчанию для этого сигнала - убить процесс, что cat
хорошо завершает работу.
Похоже, что приложение, которое вы используете, установило обработчик сигналов для всех сигналов, включая SIGPIPE, который создает небольшое всплывающее сообщение, которое вы видите.
Эта ошибка, кажется, появляется довольно часто. /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe it "... внутренняя ошибка в способности Xcode общаться с вашим телефоном. значит, вы сделали что-то не так, это ошибка в системе разработки "
Канал - это механизм 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 жалуется на то, что он запустил какую-то подпрограмму, чтобы сделать что-то с ведущим к нему каналом, и эта подпрограмма неожиданно умерла, оставив трубу сломанной.
«Разорванный» канал - это канал, на котором один конец был close()
прочитан, а другой читается или записывается. Например, в следующей команде оболочки:
cat foo | less
cat
Процесс занимает конец пишущей трубы, и less
процесс чтения один. Если процесс чтения закрывает трубу, труба сломана (и поэтому бесполезна); процесс записи получит ошибку «сломанный канал» от операционной системы.
cat
очевидно, будет, как только он закончил), читатель просто увидит нормальный конец файла.