Ho letto come vengono implementate le pipe nel kernel di Linux e ho voluto confermare la mia comprensione. Se non sono corretto, verrà selezionata la risposta con la spiegazione corretta.
- Linux ha un VFS chiamato pipefs che è montato nel kernel (non nello spazio utente)
- pipefs ha un singolo super blocco ed è montato sulla sua radice (
pipe:
), a fianco/
- pipefs non può essere visualizzato direttamente a differenza della maggior parte dei file system
- L'accesso a pipefs avviene tramite
pipe(2)
syscall - Il
pipe(2)
syscall utilizzato dalle shell per|
eseguire il piping con l' operatore (o manualmente da qualsiasi altro processo) crea un nuovo file in pipefs che si comporta praticamente come un normale file - Il file sul lato sinistro dell'operatore pipe viene
stdout
reindirizzato al file temporaneo creato in pipefs - Il file sul lato destro dell'operatore pipe è
stdin
impostato sul file su pipefs - pipefs è archiviato in memoria e attraverso qualche magia del kernel, non dovrebbe essere impaginato
Questa spiegazione di come funzionano i tubi (ad es. ls -la | less
) È praticamente corretta?
Una cosa che non capisco è come qualcosa come bash imposterà un processo ' stdin
o stdout
il descrittore di file restituito da pipe(2)
. Non sono ancora riuscito a trovare nulla al riguardo.
|
operatore stia semplicemente chiamando pipe(2)
un processo come fa bash.
pipe()
chiamata del kernel insieme al macchinario che lo supporta (pipefs
, ecc.) È di livello molto inferiore rispetto|
all'operatore offerto nella shell. Il secondo è di solito implementato usando il primo, ma non è necessario.