Как да използвате функцията тръба на език C

How Use Pipe Function C Language



Тръбата е средство за комуникация между процесите. Един процес записва данни в тръбата, а друг процес чете данните от тръбата. В тази статия ще видим как функцията pipe () се използва за реализиране на концепцията, използвайки език C.

За Pipe

В тръбата данните се поддържат в ред FIFO, което означава последователно записване на данни в единия край на тръбата и четене на данни от друг край на тръбата в същия последователен ред.







Ако някой процес чете от тръбата, но никой друг процес все още не е записал в тръбата, тогава четенето връща края на файла. Ако процесът иска да пише в тръба, но няма друг процес, прикрепен към тръбата за четене, това е състояние на грешка и тръбата генерира сигнал SIGPIPE.



Заглавен файл

#включва

Синтаксис



intтръба(intподадени документи[2])

Аргументи

Тази функция приема един аргумент, масив от две цели числа ( подадени документи ). полета [0] се използва за четене от тръбата и картотеки [1] се използва за запис на тръба. Процесът, който иска да се чете от тръбата, трябва да се затвори региони [1], и процесът, който иска да запише в тръбата, трябва да се затвори полета [0] . Ако ненужните краища на тръбата не са изрично затворени, краят на файла (EOF) никога няма да бъде върнат.





Връщащи стойности

За успеха, тръба() връща 0, при неуспех функцията връща -1.

Изобразително можем да представим тръба() функционира както следва:



По -долу са дадени няколко примера, показващи как да използвате функцията тръба на език C.

Пример 1

В този пример ще видим как функционира тръбната функция. Въпреки че използването на тръба в един процес не е много полезно, но ще получим представа.

// Пример 1.c
#включва
#включва
#включва
#включва

intглавен()
{
intн;
intподадени документи[2];
charбуфер[1025];
char *съобщение= 'Здравей свят!';

тръба(подадени документи);
пиши(подадени документи[1],съобщение, стрън (съобщение));

ако ((н=Прочети(подадени документи[0],буфер, 1024 ) ) > = 0) {
буфер[н] = 0; // прекратяваме низа
printf ('прочетете %d байта от тръбата:'%с'н',н,буфер);
}
иначе
ужас ('Прочети');
изход (0);
}

Тук за първи път създадохме тръба, използвайки тръба() функция след това се записва в тръбата с помощта слонова кост [1] край. След това данните са прочетени с помощта на другия край на тръбата, който е полета [0] . За четене и писане във файла, ние използвахме Прочети() и пиши () функции.

Пример 2

В този пример ще видим как родителските и дъщерните процеси комуникират с помощта на тръбата.

// Пример2.в
#включва
#включва
#включва
#включва
#включва

intглавен()
{
intподадени документи[2],nбайта;
pid_t детски;
charниз[] = 'Здравей свят!н';
charбуфер за четене[80];

тръба(подадени документи);

ако((детски=вилица()) == -1)
{
ужас ('вилица');
изход (1);
}

ако(детски== 0)
{
близо(подадени документи[0]);// Детският процес не се нуждае от този край на тръбата

/ * Изпратете „низ“ през изходната страна на тръбата */
пиши(подадени документи[1],низ, ( стрън (низ)+1));
изход (0);
}
иначе
{
/ * Родителският процес затваря изходната страна на тръбата */
близо(подадени документи[1]);// Родителският процес не се нуждае от този край на тръбата

/ * Четене в низ от тръбата */
nбайта=Прочети(подадени документи[0],буфер за четене, размер на(буфер за четене));
printf ('Прочетете низ: %s',буфер за четене);
}

връщане(0);
}

Първо, с помощта на тръбна функция е създадена една тръба, след което е раздвоен дочерния процес. След това дъщерният процес затваря четения край и записва в тръбата. Родителският процес затваря края за запис и чете от тръбата и го показва. Тук потокът от данни е само един начин, който е от дете до родител.

Заключение:

тръба() е мощен системен разговор в Linux. В тази статия видяхме само еднопосочен поток от данни, един процес пише, а друг процес чете, създавайки две тръби, които можем да постигнем и двупосочен поток от данни.