Що таке "труба" і як її можна "зламати"?


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

а потім зробіть це 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, який створює маленьке спливаюче повідомлення, яке ви бачите.



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()"d", а другий читається з або записується в. Наприклад, у такій команді оболонки:

cat foo | less

catПроцес займає кінець друкарській труби, і lessпроцес читання один. Якщо зчитувальний процес закриває трубу, труба розривається (і тому марно); процес запису отримає помилку "зламана труба" від операційної системи.


1
Власне, це лише "зламане", якщо читач його закриє. Якщо автор закриє його (як catочевидно, як тільки це закінчиться), читач просто побачить нормальний кінець файлу.
Випадково832

На жаль, ви абсолютно правильні ... Я оновлю свою відповідь.
Майкл Трауш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.