Czytałem o tym, jak rury są implementowane w jądrze Linuksa i chciałem zweryfikować moje zrozumienie. Jeśli się mylę, zostanie wybrana odpowiedź z poprawnym wyjaśnieniem.
- Linux ma VFS o nazwie pipefs, który jest zamontowany w jądrze (nie w przestrzeni użytkownika)
- pipefs ma pojedynczy super blok i jest montowany we własnym rootie (
pipe:
) obok/
- pipefs nie może być oglądany bezpośrednio, w przeciwieństwie do większości systemów plików
- Wejście do pipefs odbywa się poprzez
pipe(2)
syscall pipe(2)
Syscall wykorzystywane przez powłok do rur z|
operatorem (ręcznie lub z dowolnego innego procesu) tworzy nowy plik pipefs która zachowuje się prawie jak normalny plik- Plik po lewej stronie operatora potoku został
stdout
przekierowany do pliku tymczasowego utworzonego w potokach - Plik po prawej stronie operatora potoku ma
stdin
ustawiony plik na pipefs - pipefs jest przechowywany w pamięci i za pomocą jakiejś magii jądra nie powinien być stronicowany
Czy to wyjaśnienie, w jaki sposób rury (np. ls -la | less
) Działają, jest właściwie poprawne?
Jednej rzeczy, której nie rozumiem, jest to, jak coś takiego jak bash ustawiłoby proces stdin
lub stdout
zwracany przez deskryptor pliku pipe(2)
. Nie znalazłem jeszcze nic na ten temat.
|
operator po prostu wywołuje pipe(2)
jak proces bash.
pipe()
Wywołanie jądro wraz z maszyną, która je obsługuje (pipefs
itp) jest znacznie niższy poziom niż|
operator zaoferował w swojej skorupie. Ten drugi jest zwykle implementowany przy użyciu tego pierwszego, ale nie musi tak być.