Канал - это среда для связи между процессами. Один процесс записывает данные в канал, а другой процесс считывает данные из канала. В этой статье мы увидим, как функция 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. В этой статье мы видели только односторонний поток данных, один процесс пишет, а другой - читает, создав два канала, мы также можем добиться двунаправленного потока данных.