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