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ł
stdoutprzekierowany do pliku tymczasowego utworzonego w potokach - Plik po prawej stronie operatora potoku ma
stdinustawiony 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 stdinlub stdoutzwracany 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 (pipefsitp) 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ć.