Щодо вашого питання про продуктивність, труби ефективніші, ніж файли, оскільки не потрібен IO диска. Це cmd1 | cmd2
є більш ефективним, ніж cmd1 > tmpfile; cmd2 < tmpfile
(це може бути неправдою, якщо tmpfile
він підтримується на диску RAM або іншому пристрої пам'яті, як названа труба; але якщо це ім'я з ім'ям, його cmd1
слід запускати у фоновому режимі, оскільки його вихід може блокуватися, якщо труба стає повною ). Якщо вам потрібен результат cmd1
і вам все ще потрібно надіслати його вихід cmd2
, ви повинні cmd1 | tee tmpfile | cmd2
дозволити cmd1
і cmd2
паралельно запускати, уникаючи операцій з читання диска з cmd2
.
Названі труби корисні, якщо багато процесів читають / записують в одну трубу. Вони також можуть бути корисними, коли програма не призначена для використання stdin / stdout для своєї IO, яка потребує використання файлів . Я розміщую файли курсивом, тому що названі труби не є саме файлами в точку зору зберігання, оскільки вони перебувають у пам'яті та мають фіксований розмір буфера, навіть якщо вони мають запис у файловій системі (для довідки). Інші речі в UNIX містять записи файлової системи, не будучи файлами: просто подумайте про /dev/null
інші записи в /dev
або /proc
.
Оскільки труби (названі та безіменні) мають фіксований розмір буфера, операції читання / запису для них можуть блокуватися, внаслідок чого процес читання / запису переходить у стан IOWait. Крім того, коли ви отримуєте EOF під час читання з буфера пам'яті? Правила такої поведінки чітко визначені і їх можна знайти у чоловіка.
Одне, що ви не можете зробити з трубами (названими та безіменними), - це пошук даних. Оскільки вони реалізовані за допомогою буфера пам'яті, це зрозуміло.
Про "everything in Linux/Unix is a file"
, я не згоден. Названі труби мають записи файлової системи, але не є точно файловими. У безіменних трубах немає записів файлової системи (крім, можливо, в /proc
). Однак більшість операцій вводу-виводу в UNIX виконуються за допомогою функції читання / запису, для якої потрібен дескриптор файлу , включаючи неназвану трубку (і socket). Я не думаю, що ми можемо це сказати "everything in Linux/Unix is a file"
, але ми можемо це точно сказати "most IO in Linux/Unix is done using a file descriptor"
.