Відповіді:
Труби просто пов'язані з іншими дескрипторами файлів, ніж 0 (stdin):
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
Звичайно, процес може мати декілька відкритих дескрипторів файлів одночасно, тому проблем немає.
pipe()системним викликом.
pipe()а потім розщеплює підпроцеси. Основний процес містить додаткові дескриптори файлів, якщо використовується анонімна труба. Ці додаткові дескриптори файлів передаються у формі /dev/fd/..., і процес зазвичай просто відкриває їх за допомогою цих імен файлів. Це призведе до їх dup()редагування, створивши ще більш відкриті дескриптори файлів. Процес також може відразу ж використати названий дескриптор файлу без відкритих дзвінків ...
aя назвав це так ./a <(ls), і він успішно надрукував список файлів, довівши, що названий декриптор файлу (63 у моєму випадку) вже відкритий. Баш може використовувати названі канали у тимчасовому каталозі для різних архітектур, ніж Linux, і в цьому випадку ніяких додаткових дескрипторів файлів не буде відкрито при вході в основний процес.
bashсторінці.