Программирование на C

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

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

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

О трубе

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

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

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

#включать

Синтаксис

int pipe (int filedes [2])

Аргументы

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

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

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

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

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

Пример1

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

// Пример1.c
#включать
#включать
#включать
#включать
int main ()

int n;
int filedes [2];
символьный буфер [1025];
char * message = "Привет, мир!";
труба (филе);
запись (filedes [1], сообщение, strlen (сообщение));
if ((n = чтение (filedes [0], buffer, 1024))> = 0)
буфер [n] = 0; // завершаем строку
printf ("прочитать% d байт из канала:"% s "\ n", n, буфер);

еще
perror ("читать");
выход (0);

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

Пример2

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

// Пример2.c
#включать
#включать
#включать
#включать
#включать
int main ()

int filedes [2], nbytes;
pid_t childpid;
char string [] = "Привет, мир!\ п ";
char readbuffer [80];
труба (филе);
если ((childpid = fork ()) == -1)

perror («вилка»);
выход (1);

если (childpid == 0)

close (filedes [0]); // Дочернему процессу этот конец канала не нужен
/ * Отправляем "строку" через выходную сторону трубы * /
запись (filedes [1], строка, (strlen (строка) +1));
выход (0);

еще

/ * Родительский процесс закрывает выходную часть канала * /
close (filedes [1]); // Родительскому процессу этот конец канала не нужен
/ * Считываем строку из канала * /
nbytes = чтение (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Прочитать строку:% s", буфер чтения);

возврат (0);

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

Заключение:

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

Как установить League Of Legends на Ubuntu 14.04
Если вы поклонник League of Legends, то это возможность для вас протестировать League of Legends. Обратите внимание, что LOL поддерживается в PlayOnLi...
Установите последнюю версию игры OpenRA Strategy в Ubuntu Linux
OpenRA - это игровой движок Libre / Free Real Time Strategy, воссоздающий ранние игры Westwood, такие как классическая Command & Conquer: Red Alert. Р...
Установите последнюю версию эмулятора Dolphin для Gamecube и Wii в Linux
Эмулятор Dolphin позволяет вам играть в выбранные вами игры Gamecube и Wii на персональных компьютерах (ПК) Linux. Являясь свободно доступным игровым...