Comunicarea prin pipe-uri

Unul dintre mecanismele de comunicare între procese în Linux este reprezentat de pipe-uri. Pipe-urile sunt canale de comunicaţie unidirecţionale ce permit transmiterea de fluxuri de octeţi între procese (dacă se doreşte realizarea unei comunicaţii bidirecţionale este nevoie de două pipe-uri). Citirea şi scrierea în pipe se face conform algoritmului FIFO (primul intrat, primul ieşit).

Cum se construieste un pipe

Pipe-urile sunt de fapt fişiere, dar care sunt gestionate în mod diferit decât fişierele obişnuite. Pentru construirea unui pipe se foloseşte funcţia de sistem pipe() (pipe-urile construite cu funcţia pipe() se mai numesc şi pipe-uri fără nume). Funcţia pipe() returnează o pereche de descriptori. Unul dintre aceştia este conectat la capătul de scriere al pipe-ului iar celălalt este conectat la capătul de citire al pipe-ului.

    int pfds[2]; //vector ce contine descriptorii de scriere si citire
    if (pipe(pfds) == -1) {
            perror("pipe");
            exit(1);
    }

Funcţia pipe() primeşte ca argument un vector de două elemente de tip int. Dacă pipe-ul a fost construit cu succes atunci funcţia pipe returnează in primul element din vector (pfd[0]) descriptorul de fişier pentru citire şi în cel de al doilea element al vectorului (pfd[1]) descriptorul de fişier pentru scriere.

Astfel scrierea şi citire din pipe se face în acelaşi mod în care se face scrierea şi citirea din şi în fişiere obişnuite.

Scrierea si citirea pipe-urilor

După cum s-a precizat, după obţinerea descriptorilor de intrare şi de ieşire ai pipe-ului, scrierea şi citirea în pipe-uri se face în acelaşi mod ca şi în cazul fişierelor obişnuite.

write(pfds[1], "test", 4); //scrie într-un pipe 4 octeti
 
read(pfds[0], buf, 4); //citeste dintr-un pipe 4 octeti

Inchiderea pipe-ului

Închiderea descriptorilor de citire şi de scriere ai pipe-ului se face folosind funcţia sistem close().

close(pfds[0]); //inchidere descriptor de citire
 
close(pfds[1]); //inchidere descriptor de scriere

Pipe-uri cu nume

Un dezavantaj al pipe-urilor fără nume (cele prezentate în secţiunile anterioare) este că acestea pot fi folosite doar pentru comunicare între procese având strămoş comun. Dacă dorim ca două procese independente să comunice între ele prin intermediul pipe-urilor atunci se pot folosi pipe-uri cu nume.

Un pipe cu nume este un pipe al cărui puncte de acces sunt menţinute pe disc într-un fişier. Prin deschiderea fişierului pentru citire, un proces are acces la capătul de citire în pipe. Prin deschiderea fişierului pentru scriere, un proces are acces la capătul de scriere în pipe. Dacă un proces deschide fişierul pentru citire, acesta este blocat până când un alt proces deschide fişierul pentru scriere.