Jak używać funkcji potoku w języku C?

How Use Pipe Function C Language



Potok jest medium komunikacji między procesami. Jeden proces zapisuje dane do potoku, a inny proces odczytuje dane z potoku. W tym artykule zobaczymy, jak funkcja pipe() jest wykorzystywana do implementacji koncepcji przy użyciu języka C.

O rurze

W potoku dane są utrzymywane w kolejności FIFO, co oznacza sekwencyjne zapisywanie danych na jednym końcu potoku i odczytywanie danych z drugiego końca potoku w tej samej kolejności.







Jeśli jakikolwiek proces czyta z potoku, ale żaden inny proces jeszcze nie zapisał do potoku, to odczyt zwraca koniec pliku. Jeśli proces chce pisać do potoku, ale do potoku nie jest podłączony żaden inny proces do odczytu, jest to stan błędu i potok generuje sygnał SIGPIPE.



Plik nagłówka

#włączać

Składnia



intrura(intfiledes[2])

Argumenty

Ta funkcja przyjmuje pojedynczy argument, tablicę dwóch liczb całkowitych ( filedes ). filedes[0] służy do odczytu z rury i pliki[1] służy do pisania na rurze. Proces, który chce czytać z potoku, powinien się zamknąć pliki[1], a proces, który chce pisać do potoku, powinien się zamknąć filedes[0] . Jeśli niepotrzebne końce potoku nie zostaną jawnie zamknięte, koniec pliku (EOF) nigdy nie zostanie zwrócony.





Zwróć wartości

Po sukcesie rura() zwraca 0, w przypadku niepowodzenia funkcja zwraca -1.

Obrazowo możemy przedstawić rura() działają w następujący sposób:



Poniżej kilka przykładów pokazujących, jak używać funkcji potoku w języku C.

Przykład 1

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

// Przykład1.c
#włączać
#włączać
#włączać
#włączać

intGłówny()
{
intn;
intfiledes[2];
zwęglaćbufor[1025];
zwęglać *wiadomość= 'Witaj świecie!';

rura(filedes);
pisać(filedes[1],wiadomość, strlen (wiadomość));

Jeśli ((n=czytać(filedes[0],bufor, 1024 ) ) > = 0) {
bufor[n] = 0; //zakończ ciąg
printf ('odczytaj %d bajtów z potoku: '%s' ',n,bufor);
}
w przeciwnym razie
błąd ('czytać');
Wyjście (0);
}

Tutaj po raz pierwszy stworzyliśmy fajkę za pomocą rura() funkcja następnie zapisana do potoku za pomocą kość słoniowa [1] kończyć się. Następnie dane zostały odczytane za pomocą drugiego końca potoku, który jest pliki[0] . Do czytania i zapisywania do pliku zwykliśmy czytać() oraz pisać() Funkcje.

Przykład 2

W tym przykładzie zobaczymy, jak procesy nadrzędne i podrzędne komunikują się za pomocą potoku.

// Przykład2.c
#włączać
#włączać
#włączać
#włączać
#włączać

intGłówny()
{
intfiledes[2],nbajtów;
pid_t potomek;
zwęglaćstrunowy[] = 'Witaj świecie! ';
zwęglaćbufor odczytu[80];

rura(filedes);

Jeśli((dzieciak=widelec()) == -1)
{
błąd ('widelec');
Wyjście (1);
}

Jeśli(dzieciak== 0)
{
blisko(filedes[0]);//Proces potomny nie potrzebuje tego końca rury

/* Prześlij 'string' przez wyjściową stronę potoku */
pisać(filedes[1],strunowy, ( strlen (strunowy)+1));
Wyjście (0);
}
w przeciwnym razie
{
/* Proces nadrzędny zamyka wyjściową stronę potoku */
blisko(filedes[1]);//Proces nadrzędny nie potrzebuje tego końca potoku

/* Wczytaj łańcuch z potoku */
nbajtów=czytać(filedes[0],bufor odczytu, rozmiar(bufor odczytu));
printf ('Przeczytaj ciąg: %s',bufor odczytu);
}

powrót(0);
}

Najpierw utworzono jeden potok za pomocą funkcji potoku, a następnie proces potomny został rozwidlony. Następnie proces potomny zamyka koniec odczytu i zapisuje do potoku. Proces nadrzędny zamyka koniec zapisu, odczytuje z potoku i wyświetla go. Tutaj przepływ danych jest tylko jedną drogą od dziecka do rodzica.

Wniosek:

rura() to potężne wywołanie systemowe w Linuksie. W tym artykule widzieliśmy tylko jednokierunkowy przepływ danych, jeden proces zapisuje, a inny odczytuje, tworząc dwa potoki, dzięki którym możemy również osiągnąć dwukierunkowy przepływ danych.