Programowanie C

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

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

Rura jest medium komunikacji między procesami. Jeden proces zapisuje dane do potoku, a inny proces odczytuje dane z potoku. W tym artykule zobaczymy, w jaki sposób funkcja pipe() jest używana 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 sekwencyjnej.

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

Plik nagłówka

#zawierać

Składnia

potok int (pliki int[2])

Argumenty

Ta funkcja przyjmuje pojedynczy argument, tablicę dwóch liczb całkowitych (filedes). pliki[0] służy do odczytu z rury, a pliki[1] służy do pisania do rury. Proces, który chce czytać z potoku, powinien się zamknąć pliki[1], a proces, który chce pisać do potoku, powinien się zamknąć pliki[0].  Jeśli niepotrzebne końce potoku nie zostaną wyraźnie 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 C.

Przykład 1

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

// Przykład 1.do
#zawierać
#zawierać
#zawierać
#zawierać
int main()

intn;
int filedes[2];
bufor znaków[1025];
char *wiadomość = "Witaj świecie!";
rura(pliki);
write(filedes[1], wiadomość, strlen(wiadomość));
if ((n = odczyt ( filedes[0], bufor, 1024 ) ) >= 0)
bufor[n] = 0; //zakończ ciąg
printf("odczytaj %d bajtów z potoku: "%s"\n", n, bufor);

jeszcze
błąd("przeczytaj");
wyjście(0);

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

Przykład 2

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

// Przykład 2.do
#zawierać
#zawierać
#zawierać
#zawierać
#zawierać
int main()

int filedes[2], nbajtów;
pid_t numer potomny;
char string[] = "Witaj, świecie!\n";
bufor odczytu znaków[80];
rura(pliki);
if((childpid = fork()) == -1)

błąd("widelec");
wyjście (1);

if(potomek == 0)

close(filedes[0]);//Proces podrzędny nie potrzebuje tego końca potoku
/* Prześlij "string" przez wyjściową stronę potoku */
write(filedes[1], string, (strlen(string)+1));
wyjście(0);

jeszcze

/* Proces nadrzędny zamyka wyjściową stronę potoku */
close(filedes[1]);//proces nadrzędny nie potrzebuje tego końca potoku
/* Wczytaj łańcuch z potoku */
nbajtów = read(filedes[0], readbuffer, sizeof(readbuffer));
printf("Odczytaj ciąg: %s", readbuffer);

powrót(0);

Najpierw utworzono jeden potok za pomocą funkcji potoku, a następnie rozwidlono proces potomny. 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, które możemy również osiągnąć dwukierunkowy przepływ danych.

Add Mouse gestures to Windows 10 using these free tools
In recent years computers and operating systems have greatly evolved. There was a time when users had to use commands to navigate through file manager...
Control & manage mouse movement between multiple monitors in Windows 10
Dual Display Mouse Manager lets you control & configure mouse movement between multiple monitors, by slowing down its movements near the border. Windo...
WinMouse lets you customize & improve mouse pointer movement on Windows PC
If you want to improve the default functions of your mouse pointer use freeware WinMouse. It adds more features to help you get the most out of your h...