Jak używać funkcji rur w języku C

Jak używać funkcji rur w języku C

Rura jest medium do komunikacji między procesami. Jeden proces zapisuje dane do rury, a drugi proces odczytuje dane z rury. W tym artykule zobaczymy, w jaki sposób funkcja PIPE () jest używana do wdrożenia koncepcji za pomocą języka C.

O rurze

W rurze dane są przechowywane w kolejności FIFO, co oznacza zapisanie danych na jednym końcu rury sekwencyjnie i odczyt danych z innego końca rury w tej samej kolejności sekwencyjnej.

Jeśli jakikolwiek proces odczytuje z rurki, ale żaden inny proces nie zapisał się jeszcze w rurze, przeczytaj zwraca koniec pliku. Jeśli proces chce napisać do rury, ale nie ma innego procesu przymocowanego do rury do odczytu, to jest to warunek błędu, a rura generuje sygnał SIGPipe.

Plik nagłówka

#włączać

Składnia

INT RURE (INT SILEDES [2])

Argumenty

Ta funkcja przyjmuje jeden argument, szereg dwóch liczb całkowitych (zapisane). Siledes [0] jest używany do czytania z rury i Siledes [1] jest używany do pisania do rury. Proces, który chce odczytać z rury, powinien się zamknąć Siledes [1], a proces, który chce napisać do rury, powinien się zamknąć Siledes [0]. Jeśli niepotrzebne końce rury nie są wyraźnie zamknięte, to koniec pliku (EOF) nigdy nie zostanie zwrócony.

Wartości zwracane

O sukcesie, rura() zwraca 0, dla awarii funkcja zwraca -1.

Pictorialnie możemy reprezentować rura() funkcja w następujący sposób:

Poniżej znajduje się kilka przykładów przedstawiających sposób korzystania z funkcji rur w języku C.

Przykład 1

W tym przykładzie zobaczymy, jak działa funkcja rury. Chociaż użycie rury w jednym procesie nie jest bardzo przydatne, ale dostaniemy pomysł.

// Przykład 1.C
#włączać
#włączać
#włączać
#włączać
int main ()

int n;
Int Siledes [2];
Char Buffer [1025];
char *message = "Hello, świat!";
rura (zapisane);
Write (Siledes [1], wiadomość, strlen (wiadomość));
if ((n = odczyt (squedes [0], bufor, 1024))> = 0)
bufor [n] = 0; // Zakończ ciąg
printf („czytaj %d bajty z rury:„ %s ”\ n”, n, bufor);

w przeciwnym razie
Perror („Read”);
wyjście (0);

Tutaj najpierw utworzyliśmy fajkę za pomocą rura() funkcja, a następnie zapisana do rury za pomocą Fildes [1] koniec. Następnie dane zostały odczytane przy użyciu drugiego końca rury, czyli Siledes [0]. Do czytania i zapisywania pliku, kiedyś kiedyś Czytać() I pisać() Funkcje.

Przykład2

W tym przykładzie zobaczymy, w jaki sposób procesy rodzica i dzieci komunikują się za pomocą rury.

// Przykład2.C
#włączać
#włączać
#włączać
#włączać
#włączać
int main ()

int Filedes [2], nbytes;
PID_T childpid;
Char String [] = "Hello, World!\N";
Char ReadBuffer [80];
rura (zapisane);
if ((childpid = widelec ()) == -1)

Perror („widelec”);
wyjście (1);

if (childpid == 0)

Zamknij (pliki [0]); // Proces dziecięcy nie potrzebuje tego końca rury
/ * Wyślij „ciąg” przez stronę wyjściową rury */
Write (Siledes [1], string, (strlen (string) +1));
wyjście (0);

w przeciwnym razie

/ * Proces nadrzędny zamyka wyjściową stronę rury */
Zamknij (pliki [1]); // Proces nadrzędny nie potrzebuje tego końca rury
/ * Odczyt w ciągu rury */
nBytes = read (Sileedes [0], ReadBuffer, sizeof (readBuffer));
printf („czytaj string: %s”, readBuffer);

zwrot (0);

Najpierw utworzono jedną rurę za pomocą funkcji rur, a następnie proces dziecięcy został rozwidlony. Następnie proces dziecka zamyka koniec odczytu i pisze do rury. Proces nadrzędny zamyka koniec zapisu i odczytuje z rury i wyświetla go. Tutaj przepływ danych to tylko jeden sposób, który jest od dziecka do rodzica.

Wniosek:

rura() to potężne wywołanie systemowe w Linux. W tym artykule widzieliśmy tylko jednokierunkowy przepływ danych, jeden proces pisze, a inny proces odczytuje, tworząc dwie rury, możemy również osiągnąć dwukierunkowy przepływ danych.