Programare C

Cum se folosește funcția pipe în limbajul C

Cum se folosește funcția pipe în limbajul C

O conductă este un mediu de comunicare între procese. Un proces scrie date în țeavă, iar un alt proces citește datele din țeavă. În acest articol, vom vedea cum funcția pipe () este utilizată pentru a implementa conceptul folosind limbajul C.

Despre Pipe

În conductă, datele sunt menținute într-o ordine FIFO, ceea ce înseamnă scrierea datelor la un capăt al conductei secvențial și citirea datelor de la un alt capăt al conductei în aceeași ordine secvențială.

Dacă vreun proces citește din țeavă, dar niciun alt proces nu a scris încă în țeavă, atunci citirea returnează sfârșitul fișierului. Dacă un proces dorește să scrie pe o conductă, dar nu există alt proces atașat la conductă pentru citire, atunci aceasta este o condiție de eroare, iar conducta generează un semnal SIGPIPE.

Fișier antet

#include

Sintaxă

int pipe (int filedes [2])

Argumente

Această funcție acceptă un singur argument, o matrice de două numere întregi (filedes). filedes [0] este folosit pentru citirea din conductă și filedes [1] este folosit pentru scrierea la țeavă. Procesul care dorește să citească din conductă ar trebui să se închidă filedes [1], iar procesul care dorește să scrie pe țeavă ar trebui să se închidă filedes [0].  Dacă capetele inutile ale conductei nu sunt închise în mod explicit, atunci sfârșitul fișierului (EOF) nu va fi returnat niciodată.

Returnează valorile

La succes, țeavă () returnează 0, pentru eșec funcția returnează -1.

Pictural, putem reprezenta țeavă () funcționează după cum urmează:

Mai jos sunt câteva exemple care descriu modul de utilizare a funcției pipe în limbajul C.

Exemplul 1

În acest exemplu, vom vedea cum funcționează funcția de țeavă. Deși utilizarea unei țevi într-un singur proces nu este foarte utilă, dar vom avea o idee.

// Exemplul 1.c
#include
#include
#include
#include
int main ()

int n;
int filedes [2];
tampon char [1025];
char * message = "Bună ziua, lume!";
țeavă (filedes);
scrie (filedes [1], mesaj, strlen (mesaj));
if ((n = read (filedes [0], buffer, 1024))> = 0)
tampon [n] = 0; // terminați șirul
printf ("citește% d octeți din țeavă:"% s "\ n", n, tampon);

altceva
perror ("citit");
ieșire (0);

Aici am creat mai întâi o conductă folosind țeavă () funcția apoi scrisă pe conductă folosind fildes [1] Sfârșit. Apoi, datele au fost citite folosind celălalt capăt al conductei, care este filedes [0]. Pentru citire și scriere în fișier, am obișnuit citit() și scrie() funcții.

Exemplul 2

În acest exemplu, vom vedea cum comunică procesele părinte și copil folosind conducta.

// Exemplul 2.c
#include
#include
#include
#include
#include
int main ()

int filedes [2], nbytes;
pid_t childpid;
char string [] = "Bună ziua, lume!\ n ";
char readbuffer [80];
țeavă (filedes);
if ((childpid = furcă ()) == -1)

perror („furculiță”);
ieșire (1);

if (childpid == 0)

close (filedes [0]); // Procesul copil nu are nevoie de acest capăt al conductei
/ * Trimiteți „șir” prin partea de ieșire a țevii * /
write (filedes [1], șir, (strlen (șir) +1));
ieșire (0);

altceva

/ * Procesul părinte închide partea de ieșire a țevii * /
close (filedes [1]); // Procesul părinte nu are nevoie de acest capăt al conductei
/ * Citește într-un șir din țeavă * /
nbytes = read (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Citește șir:% s", readbuffer);

returnare (0);

În primul rând, o conductă a fost creată utilizând funcția de conductă, apoi un proces copil a fost bifurcat. Apoi, procesul copil închide capătul de citire și scrie în țeavă. Procesul părinte închide capătul de scriere și citește din țeavă și îl afișează. Aici fluxul de date este doar un mod, de la copil la părinte.

Concluzie:

țeavă () este un apel puternic de sistem în Linux. În acest articol, am văzut doar un flux de date unidirecțional, un proces scrie și un alt proces citește, creând două conducte, putem realiza și un flux de date bidirecțional.

OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...
OpenTTD Tutorial
OpenTTD is one of the most popular business simulation games out there. In this game, you need to create a wonderful transportation business. However,...
SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...