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
stdoutreindirizzato al file temporaneo creato in pipefs - Il file sul lato destro dell'operatore pipe è
stdinimpostato 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 ' stdino stdoutil 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.