Тръбата е среда за комуникация между процесите. Един процес записва данни в тръбата, а друг процес чете данните от тръбата. В тази статия ще видим как функцията pipe () се използва за реализиране на концепцията с помощта на C език.
За тръбата
В тръбата данните се поддържат в последователност FIFO, което означава последователно записване на данни в единия край на тръбата и четене на данни от друг край на тръбата в същия последователен ред.
Ако някой процес чете от тръбата, но никой друг процес все още не е записал в тръбата, тогава read връща края на файла. Ако даден процес иска да пише в тръба, но няма друг процес, прикрепен към тръбата за четене, това е състояние на грешка и тръбата генерира сигнал SIGPIPE.
Заглавен файл
#includeСинтаксис
int тръба (int files [2])Аргументи
Тази функция приема един аргумент, масив от две цели числа (подадени). поляци [0] се използва за отчитане от тръбата и поляци [1] се използва за запис в тръбата. Процесът, който иска да чете от тръбата, трябва да се затвори поляци [1], и процесът, който иска да пише в тръбата, трябва да се затвори поляци [0]. Ако ненужните краища на тръбата не са изрично затворени, тогава края на файла (EOF) никога няма да бъде върнат.
Връща стойности
При успех, тръба() връща 0, при неуспех функцията връща -1.
Нагледно можем да представим тръба() функционират както следва:
По-долу са дадени няколко примера, изобразяващи как да се използва функцията pipe на език C.
Пример1
В този пример ще видим как работи функцията на тръбата. Въпреки че използването на тръба в един процес не е много полезно, но ще получим идея.
// Пример1.° С#include
#include
#include
#include
int main ()
int n;
int подсигурени [2];
буфер за символи [1025];
char * message = "Здравей, Свят!";
тръба (подадена);
запис (файлови [1], съобщение, strlen (съобщение));
if ((n = четене (подадени [0], буфер, 1024))> = 0)
буфер [n] = 0; // прекратяване на низа
printf ("прочетете% d байта от тръбата:"% s "\ n", n, буфер);
друго
perror ("четене");
изход (0);
Тук първо създадохме тръба с помощта тръба() след това се записва в тръбата с помощта на fildes [1] край. След това данните са прочетени с помощта на другия край на тръбата, който е поляци [0]. За четене и запис във файла, ние използвахме Прочети() и напиши () функции.
Пример2
В този пример ще видим как родителските и дъщерните процеси комуникират посредством тръбата.
// Пример2.° С#include
#include
#include
#include
#include
int main ()
int файловете [2], nbytes;
pid_t childpid;
char string [] = "Здравей, свят!\н";
char буфер за четене [80];
тръба (подадена);
if ((childpid = fork ()) == -1)
perror ("вилица");
изход (1);
ако (Childpid == 0)
close (сервер [0]); // Процесът на детето не се нуждае от този край на тръбата
/ * Изпратете "низ" през изходната страна на тръбата * /
запис (файлови [1], низ, (strlen (низ) +1));
изход (0);
друго
/ * Родителският процес затваря изходната страна на тръбата * /
close (сервер [1]); // Родителският процес не се нуждае от този край на тръбата
/ * Прочетете в низ от тръбата * /
nbytes = четене (подадени файлове [0], буфер за четене, sizeof (readbuffer));
printf ("Четене на низ:% s", буфер за четене);
връщане (0);
Първо, една тръба е създадена с помощта на функцията на тръбата, след което е раздвоен детски процес. След това дъщерният процес затваря края на четене и записва в тръбата. Родителският процес затваря края на запис и чете от тръбата и го показва. Тук потокът от данни е само един начин, който е от дете към родител.
Заключение:
тръба() е мощен системен разговор в Linux. В тази статия видяхме само еднопосочен поток от данни, един процес пише и друг процес чете, създавайки две тръби, които можем да постигнем и двупосочен поток от данни.