Я читав про те, як труби реалізовані в ядрі Linux, і хотів підтвердити своє розуміння. Якщо я невірний, буде обрана відповідь з правильним поясненням.
- У Linux є VFS під назвою pipefs, який встановлюється в ядрі (не в просторі користувача)
- pipefs має єдиний супер блок і встановлюється під його власним root (
pipe:
) поряд/
- pipefs неможливо переглядати безпосередньо на відміну від більшості файлових систем
- Вхід до pipefs здійснюється через
pipe(2)
системну виклик pipe(2)
Системний виклик , який використовується оболонками для трубопроводів з|
оператором (вручну або з будь-якого іншого процесу) створює новий файл в pipefs , який веде себе дуже схоже на звичайний файл- Файл з лівого боку оператора труби
stdout
перенаправлений на тимчасовий файл, створений у pipefs - Файл у правій частині оператора труби
stdin
встановлений на файл на pipefs - pipefs зберігається в пам'яті і через деяку магію ядра, вона не повинна бути підписана на сторінку
Чи є це пояснення того, як труби (наприклад ls -la | less
) функціонують досить правильно?
Я не розумію, як щось на зразок bash встановило б процес " stdin
або stdout
дескриптор файлів, повернутий pipe(2)
. Я про це ще нічого не міг знайти.
Так, я конкретно маю на увазі операції нижчого рівня з припущенням, що
—
Брендон Вамбольдт
|
оператор просто викликає pipe(2)
як процес, як це робить bash.
Дивіться також Яка різниця між "Перенаправлення" та "Труба"?
—
Сергій Колодяжний
pipe()
Виклик ядра поряд з технікою , яка підтримує його (pipefs
і т.д.) значно нижчий рівень , ніж|
оператор , що надається в оболонці. Останній зазвичай реалізується за допомогою першого, але цього не повинно бути.