Odpowiedzi:
Potoki są po prostu powiązane z innymi deskryptorami plików niż 0 (standardowe wejście):
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
Proces może oczywiście mieć więcej niż jeden otwarty deskryptor pliku na raz, więc nie ma problemu.
pipe()
wywołanie systemowe.
pipe()
a następnie wyświetla podprocesy. Główny proces ma otwarte dodatkowe deskryptory plików, jeśli używany jest anonimowy potok. Te dodatkowe deskryptory plików są przekazywane w formie /dev/fd/...
, a proces zwykle po prostu je otwiera przy użyciu tych nazw plików. Doprowadzi to do ich dup()
edycji, tworząc jeszcze bardziej otwarte deskryptory plików. Proces może również od razu użyć nazwanego deskryptora pliku bez żadnych otwartych wywołań ...
a
, nazwałem go jako ./a <(ls)
, i pomyślnie wydrukowałem listę plików, udowadniając, że nazwany dekryptor plików (w moim przypadku 63) był już otwarty. Bash może używać nazwanych potoków w katalogu tymczasowym na innej architekturze niż Linux, w którym to przypadku żadne dodatkowe deskryptory plików nie byłyby otwarte po wejściu do głównego procesu.
bash
stronie man.