Что такое «труба» и как ее можно «сломать»?

12

введите описание изображения здесь

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

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

Моше
источник
3
Труба - это длинная труба, которая содержит много данных. Если приемный конец канала перестает извлекать данные, он начинает резервное копирование, и канал разрывается. Компьютер информирует конец, который вставляет данные в канал, о том, что это произошло.
Всезнающий

Ответы:

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

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


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

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


источник
Так что такое "сломанная" труба?
Моше
pr -e4 -n ten-thousand-lines.c | sed 10qзаканчивается сломанной трубой. prПотрудитесь ли сказать вам, что он получил сигнал SIGPIPE - другое дело; он может просто выйти в результате сигнала (генерируя ненулевой статус выхода).
Джонатан Леффлер
Трубы не обязательно соединяют «стандартный» вход и выход. Можно программно пропустить любой ввод / вывод через канал, хотя из командной строки вы правы.
CarlF
2

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

cat myfile.txt | head

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

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

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

bukzor
источник
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процесс чтения один. Если процесс чтения закрывает трубу, труба сломана (и поэтому бесполезна); процесс записи получит ошибку «сломанный канал» от операционной системы.

Майкл Трауш
источник
1
Фактически, это только "сломано", если читатель закрывает это. Если автор закрывает его (как, catочевидно, будет, как только он закончил), читатель просто увидит нормальный конец файла.
Random832
Ой, вы абсолютно правы ... Я обновлю свой ответ.
Майкл Трауш