Pipe (informatică)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Termenul țeavă are două semnificații strâns legate:

Pipe ca instrument de comunicare între procese

În sistemele de operare, o conductă este unul dintre instrumentele disponibile pentru a face procesele să comunice între ele. Țevile , spre deosebire de prize , oferă un canal de comunicare unidirecțional și, prin urmare, două trebuie utilizate pentru a realiza o comunicare bidirecțională.

În sistemele de operare Unix și similare Unix , o conductă este accesibilă printr-o pereche de descriptori de fișiere , unul pentru a scrie date și celălalt pentru a le citi. Un proces creează o conductă utilizând apelul de sistem pipe (2) , care returnează cei doi descriptori de fișiere. [1]

În mod similar, în sistemele de operare Microsoft Windows , o conductă convențională se numește conductă anonimă și este utilizabilă printr-o pereche de mânere : prima pentru scrierea datelor, a doua pentru citire. Pentru a crea o conductă anonimă , trebuie utilizat apelul de sistem CreatePipe .

Fluxul de date scris de un proces ( scriitor ) către descriptorul de fișiere sau mânerul deschis pentru scriere este apoi citit (în aceeași ordine) de către celălalt proces ( cititor ) prin intermediul descriptorului de fișiere sau mânerul deschis pentru citire. Datele generate de scriitor și care nu au fost încă citite sunt stocate de sistemul de operare într-un buffer de dimensiuni prestabilite (de obicei câțiva KiB ), din care sunt eliminate automat după citire.

Tamponul este utilizat ca mecanism de sincronizare între cele două procese: când se umple, procesul de scriere este suspendat în operațiunea de scriere până când cititorul a preluat o parte din date; când bufferul este gol, cititorul este suspendat în operația de citire până când scriitorul a trimis date noi.

Cele două procese care comunică printr-o conductă trebuie să schimbe cumva descriptori de fișiere sau mânere pentru a le utiliza:

  • în sistemele de operare Unix și Unix-like, un proces poate, prin apelul de sistem de țevi , să creeze o țeavă , apoi, prin apelul de sistem fork , să creeze un proces copil , care moștenește descriptorii de fișiere ai părintelui: procesul părinte pe care îl poate trimite date către procesul copil prin scrierea în descriptorul de fișier deschis pentru scriere, în timp ce procesul copil poate primi prin citirea acestuia din celălalt descriptor de fișier (deschis pentru citire). Această metodă necesită o relație de rudenie între cele două procese. Alte metode necesită schimbul de descriptori de fișiere printr-un socket de domeniu Unix. [2]
  • pe sistemele de operare Microsoft Windows , un proces poate crea o conductă anonimă printr-un apel de sistem și apoi poate crea un nou proces cu care să partajeze mânere prin specificarea parametrilor la apelul de sistem CreateProcess .

FIFO sau țevi numite

Dacă două procese care trebuie să comunice între ele cu o țeavă sunt complet separate (adică nu au nicio modalitate de a schimba descriptori sau mânere de fișiere), este posibil să creați în sistemul de fișiere un fișier special numit FIFO sau numit țeavă , care acționează ca un punct de acces la conductă : scrierea în acest fișier special trimite date către conductă , în timp ce o citiți poate fi preluată. Trebuie subliniat că și în acest caz datele schimbate nu sunt stocate temporar în sistemul de fișiere , ci trec de la un proces la altul printr-un buffer.

În acest fel, un proces poate oferi un serviciu altor procese prin deschiderea unei țevi numite într-o locație cunoscută din sistemul de fișiere .

În sistemele de operare Unix și similare Unix , o conductă numită poate fi creată prin intermediul comenzii mknod sau prin intermediul apelului de sistem mknod cu același nume sau prin intermediul comenzii mkfifo ; procesele care comunică prin intermediul acestuia trebuie să ruleze pe aceeași gazdă (de exemplu, nu este posibil să se utilizeze o conductă numită creată într-un sistem de fișiere partajat din rețea, cum ar fi NFS pentru a face comunicarea proceselor rezidente pe diferite gazde ).

Pe sistemele de operare Microsoft Windows , conductele numite sunt create folosind apelul de sistem CreateNamedPipe . Spre deosebire de sistemele Unix și Unix, acestea pot fi utilizate direct de procesele care se află pe diferite gazde .

Funcția de țeavă în cochilii de text

În textul shell-urilor multor sisteme de operare (inclusiv sistemele Unix și Unix-like, MS-DOS și Microsoft Windows) există o sintaxă pentru combinarea a două programe simple între ele cu o conductă , pentru a efectua procesări complexe în cascadă fără „utilizarea fișierelor temporare (și, prin urmare, potrivite de exemplu pentru volume mari de date).

Caracterul folosit în sintaxă este bara verticală : | , numit uneori țeavă în sine; este inserat între invocațiile a două sau mai multe programe pentru a spune shell-ului că datele direcționate către ieșirea standard a programului anterior ar trebui trimise la intrarea standard a următorului program folosind o conductă . De fapt, shell - ul creează conductele printr-un apel de sistem și apoi pornește programele indicate prin înlocuirea ieșirii standard și a intrării standard cu descriptorii de fișiere ai conductei .

De exemplu, pe sistemele Unix și Unix, următoarea linie de comandă citește fișierul file.txt prin comanda cat , care trimite date către comanda tr pentru a înlocui spațiile și semnele de punctuație cu caracterul returnat un șef; la rândul său , trece rezultatul la sortare comanda pentru a sorta liniile, care trece la Uniq comandă pentru a elimina liniile duplicat, obținându -se astfel o listă ordonată alfabetic a cuvintelor conținute în fișierul:

 cat file.txt | tr '[[: space:] [: punct:]]' '\ n' | sortare | uniq

O secvență de comenzi unite cu țevi precum cea de mai sus se numește o conductă software .

Un program conceput să funcționeze citind date de la intrarea standard și producând rezultatul la ieșirea standard se numește filtru .

Notă

  1. ^ (EN) W. Richard Stevens, 14.2 Pipes, în Advanced Programming in the UNIX Environment, Addison Wesley, 1992, pp. 428-434, ISBN 0-201-56317-7 .
  2. ^ (EN) W. Richard Stevens, 6:10 Descrierea fișierelor de trecere, Programarea rețelei UNIX, Prentice Hall, 1990, pp. 306-312, ISBN 0-13-949876-1 .

Elemente conexe