Які переваги використання названої труби над безіменною трубою?


51

Я переглядав набір питань для інтерв'ю, які задаються адміністратором Unix; Я знайшов тему під назвою "названа труба".

Я гуглив тему; я певною мірою змогла це зрозуміти: - названі труби || ФІФО

Але все одно я відчуваю, що мені бракує знань, коли використовувати саме цей тип труб. Чи є якісь особливі ситуації, коли неназвані труби не спрацювали?


Ще одне посилання на технічний форум: writeulearn.com/category/inter-process-communicationipc

Відповіді:


39

Названі труби (фіфо) мають чотири три переваги, про які я можу придумати:

  • вам не потрібно одночасно запускати процеси читання / запису
  • Ви можете мати декількох читачів / письменників, які не потребують спільного походження
  • як файл ви можете контролювати право власності та дозволи
  • вони двонаправлені, безіменні труби можуть бути односпрямованими *

    *) Подумайте про стандартну оболонки |трубопроводу , який є односпрямованим, кілька оболонок ( ksh, zshі bash) також пропонують coprocesses , які дозволяють двонаправлену зв'язок. POSIX розглядає труби як напівдуплексні (тобто кожна сторона може читати або записувати), pipe()системний виклик повертає дві ручки файлів, і вам може знадобитися трактувати одну як лише для читання, а другу як лише для запису. Деякі системи (BSD) підтримують одночасне читання та запис (не заборонено POSIX), для інших вам знадобиться дві труби, по одній для кожного напрямку. Перевірте pipe(), popen()і , можливо , popen2()сторінки людини. Ненаправленість може не залежати від того, назва труби названа чи ні, хоча на Linux 2.6 це залежить.

(Оновлено, завдяки відгукам Stephane Chazelas )

Отже, однією з очевидних завдань, яку ви не можете досягти за допомогою безіменного каналу, є звичайна програма клієнт / сервер.

Останній (вражений) пункт про однонаправлені труби є актуальним для Linux, POSIX (див. popen()) Говорить про те, що трубу потрібно читати або записувати лише в Linux, вони є односпрямованими . Див. Розуміння ядра Linux (3-е вид. O'Reilly) для детальних відомостей про Linux (p787). Інші ОС пропонують двонаправлені (безіменні) труби.

Як приклад, Nagios використовує фіфо для свого командного файлу . Різні зовнішні процеси (сценарії CGI, зовнішні перевірки, NRPE і т.д.) записують команди / оновлення до цього файлу, і вони обробляються стійким процесом Nagios.

Названі труби мають особливості, що не відрізняються від TCP-з'єднань, але є важливі відмінності. Оскільки у fifo є стійке ім'я файлової системи, ви можете писати в нього навіть тоді, коли немає читача, правда, запис буде блокований (без асинхронізації або не блокує введення-виведення), хоча ви не втратите дані, якщо приймач не буде розпочато (або перезапускається).

Для ознайомлення дивіться також сокети домену Unix та відповідь на це питання Stackoverflow, який узагальнює основні методи IPC , і цей, про який йдетьсяpopen()


2
Ви також можете мати декілька читачів / авторів з неназваними каналами. У Linux вони не є двонаправленими, ніж безмежна труба. Існує кінець запису і кінець читання, і дані протікають лише в одному напрямку. Відкриваючи фіфо в режимі запису, ви отримуєте закінчення запису, в режимі читання закінчення читання, в режимі rw, ви записуєте до кінця запису і читаєте з читання. Це відрізняється від двонаправлених труб або розеток доменного Unix, де ви насправді маєте два окремих потоки даних у кожному напрямку.
Стефан Шазелас

@StephaneChazelas дякую за відгук, я оновив відповідь, щоб бути більш конкретним, та уточнити (сподіваюся) труби та спрямованість.
mr.spuratic

Чи передбачає зв'язок із названою трубою дискового вводу? Або все це в пам’яті? Від чого залежить ефективність роботи цих механізмів IPC?
CMCDragonkai

15

Безіменні або анонімні труби забезпечують спосіб одноосібного одностороннього міжпроцесорного зв’язку між різними процесами, пов'язаними або відносинами батько-дитина, або будучи дітьми звичайного батька, який забезпечує трубу, наприклад, оболонки процес. Оскільки процеси пов'язані, об'єднання дескрипторів файлів у трубу може бути неявним і не потребує об'єкта з ім'ям, яке є зовнішнім для процесів. Безіменна труба існує лише до тих пір, поки процесори, які використовують її, підтримують відкриті дескриптори файлів. Коли процеси виходять і ОС закриває всі дескриптори файлів, пов'язані з процесами, безіменна труба закривається.

Названі труби насправді є FIFO. Це стійкі об'єкти, представлені вузлами у файловій системі. Названа труба забезпечує багато-багато-двосторонній зв'язок між одним або декількома процесами, які не обов'язково пов'язані між собою і не повинні існувати одночасно. Назва файлу труби служить адресою або контрактом між процесами для зв'язку. Якщо лише один процес записує в іменовану трубку, а інший процес зчитується з названої труби, то названа труба поводиться так само, як і неназвана труба між двома пов'язаними процесами.

Отже, коротка відповідь полягає в тому, що вам потрібна названа труба для зв'язку між спорідненими процесами, які можуть не існувати одночасно.


+1 Я думаю, що процеси майже завжди існують одночасно (інакше труба трохи безглузда - ви також можете просто залишити речі в звичайному файлі). Ці сокети домену та unix часто використовуються службами демон, якими можна керувати, наприклад, з командного рядка. Якщо ви заглянете в /runнастільну систему Linux, ви, мабуть, знайдете декілька обох (з назвою fifos та unix sockets). Це форма IPC .
золотинки

2
@goldilocks: названа труба зазвичай використовується як спеціальна поштова скринька для резидентів пам’яті між процесами у вбудованих системах, де комунікаційні процеси є нетривалими і не існують одночасно. Перевагою є простота реалізації та IPC спільної пам'яті та те, що використовується тільки оперативна пам'ять. Недоліком є ​​непостійність між чобітками та байт-FIFO характер труби порівняно з можливістю використовувати структуру із загальною пам'яттю.
Джонатан Бен-Аврахам

@jonathan: +1, у мене є сумніви: - чому ми називаємо труби з назвою FIFO; що таке стійкі об’єкти?
Анкіт

@Ankit: Деякі люди називають названу трубу FIFO, оскільки вона поводиться як структура даних FIFO, особливо коли вона відкрита для читання і запису одним процесом. Під "стійким об'єктом" я мав на увазі, що названа труба пов'язана з об'єктом файлової системи. Тобто це тип файлу, з ім'ям, і він має таку ж стійкість, як і будь-який інший файл, що зберігається на носії.
Джонатан Бен-Аврахам

4

Одна з переваг, що не згадується в іншому місці, полягає в тому, що названа труба може використовуватися в місцях, де буде працювати лише файл.

Наприклад, деякі клієнти електронної пошти мають можливість додавати вміст ~ / .signature до кожного електронного повідомлення. Якщо .signature був параметром командного рядка або якщо поштовий клієнт зміг помітити, що .signature виконується і запустити його, то вам не знадобиться названа труба. Але якщо поштовий клієнт не такий складний, ви можете створити іменовану трубку під назвою.


Цікаво. У вас є така програма? Здається, доведеться спостерігати на рівні ядра, щоб побачити, коли до нього звертається FIFO.
Wildcard

4

Є ще одна перевага названих труб: їх можна використовувати в різних системах . Припустимо, вам потрібно спілкуватися в режимі реального часу двох процесів, що працюють на різних машинах. Потім поділіться папкою між цими двома, покладіть свій FIFO на папку, і ви вийдете. Це значно простіше, ніж перетворити додаток, призначений для роботи над файлами, в сервіс, який прослуховує порт.

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