Я отримав помилку "зламана труба" від 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
а потім зробіть це 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 це "... внутрішня помилка в здатності 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()
"d", а другий читається з або записується в. Наприклад, у такій команді оболонки:
cat foo | less
cat
Процес займає кінець друкарській труби, і less
процес читання один. Якщо зчитувальний процес закриває трубу, труба розривається (і тому марно); процес запису отримає помилку "зламана труба" від операційної системи.
cat
очевидно, як тільки це закінчиться), читач просто побачить нормальний кінець файлу.