Как использовать функцию конвейера на языке C

How Use Pipe Function C Language



Канал - это среда для связи между процессами. Один процесс записывает данные в канал, а другой процесс считывает данные из канала. В этой статье мы увидим, как функция pipe () используется для реализации концепции с использованием языка C.

О трубе

В канале данные хранятся в порядке FIFO, что означает последовательную запись данных на один конец канала и чтение данных с другого конца канала в том же последовательном порядке.







Если какой-либо процесс читает из канала, но ни один другой процесс еще не записал в канал, то чтение возвращает конец файла. Если процесс хочет записать в канал, но к каналу для чтения нет другого процесса, то это состояние ошибки, и канал генерирует сигнал SIGPIPE.



Заголовочный файл

#включают

Синтаксис



intтрубка(intFiledes[2])

Аргументы

Эта функция принимает единственный аргумент, массив из двух целых чисел ( Filedes ). filedes [0] используется для чтения из трубы, а filedes [1] используется для записи в трубу. Процесс, который хочет читать из канала, должен закрываться. filedes [1], и процесс, который хочет записать в канал, должен закрыть filedes [0] . Если ненужные концы канала явно не закрыты, то конец файла (EOF) никогда не будет возвращен.





Возвращаемые значения

В случае успеха трубка() возвращает 0, в случае ошибки функция возвращает -1.

Графически мы можем представить трубка() функционируют следующим образом:



Ниже приведены несколько примеров, показывающих, как использовать функцию конвейера на языке C.

Пример1

В этом примере мы увидим, как работает функция конвейера. Хотя использование конвейера в одном процессе не очень полезно, но мы получим представление.

// Example1.c
#включают
#включают
#включают
#включают

intглавный()
{
intп;
intFiledes[2];
charбуфер[1025];
char *сообщениезнак равно 'Привет, мир!';

трубка(Filedes);
записывать(Filedes[1],сообщение, Strlen (сообщение));

если ((пзнак равночитать(Filedes[0],буфер, 1024 ) ) > = 0) {
буфер[п] знак равно 0; // завершаем строку
printf ('прочитать% d байт из канала:'%s' п',п,буфер);
}
еще
перрор ('читать');
выход (0);
}

Здесь мы сначала создали трубу, используя трубка() функция затем записывается в канал с использованием слоновая кость [1] конец. Затем данные были прочитаны с использованием другого конца канала, который filedes [0] . Для чтения и записи в файл мы использовали читать() а также записывать() функции.

Пример2

В этом примере мы увидим, как родительский и дочерний процессы взаимодействуют с помощью канала.

// Example2.c
#включают
#включают
#включают
#включают
#включают

intглавный()
{
intFiledes[2],nbytes;
pid_t childpid;
charнить[] знак равно 'Привет, мир! п';
charбуфер чтения[80];

трубка(Filedes);

если((ребенокзнак равновилка()) == -1)
{
перрор ('вилка');
выход (1);
}

если(ребенок== 0)
{
близко(Filedes[0]);// Дочернему процессу этот конец канала не нужен

/ * Отправляем 'строку' через выходную сторону канала * /
записывать(Filedes[1],нить, ( Strlen (нить)+1));
выход (0);
}
еще
{
/ * Родительский процесс закрывает выходную часть канала * /
близко(Filedes[1]);// Родительскому процессу этот конец канала не нужен

/ * Считываем строку из канала * /
nbytesзнак равночитать(Filedes[0],буфер чтения, размер(буфер чтения));
printf ('Прочитать строку:% s',буфер чтения);
}

возвращение(0);
}

Сначала был создан один канал с использованием функции канала, затем был разветвлен дочерний процесс. Затем дочерний процесс закрывает конец чтения и записывает в канал. Родительский процесс закрывает конец записи, читает из канала и отображает его. Здесь поток данных - это только один путь - от дочернего к родительскому.

Заключение:

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