Все о pipe () Функция:
Синтаксис трубка() функция:
int pipe (int pipefd [2]);Здесь функция pipe () создает однонаправленный канал данных для межпроцессного взаимодействия. Вы проходите через int (Целочисленный) массив типов pipefd состоящий из 2 элементов массива для функции pipe (). Затем функция pipe () создает два файловых дескриптора в pipefd множество.
Первый элемент pipefd множество, pipefd [0] используется для чтения данных из трубы.
Второй элемент pipefd множество, pipefd [1] используется для записи данных в канал.
В случае успеха функция pipe () возвращает 0. Если во время инициализации канала возникает ошибка, функция pipe () возвращает -1.
Функция pipe () определена в заголовке unistd.час. Чтобы использовать функцию pipe () в вашей программе на C, вы должны включить заголовок unistd.час следующим образом:
#включатьДля получения дополнительной информации о системной функции pipe () проверьте страницу руководства pipe () с помощью следующей команды:
трубка $ man 2Страница руководства pipe ().
Пример 1:
Для первого примера создайте новый исходный файл C 1_трубка.c и введите следующие строки кодов.
#включать#включать
#включать
int main (void)
int pipefds [2];
if (pipe (pipefds) == -1)
perror («труба»);
выход (EXIT_FAILURE);
printf ("Прочитать значение дескриптора файла:% d \ n", pipefds [0]);
printf ("Записать значение дескриптора файла:% d \ n", pipefds [1]);
вернуть EXIT_SUCCESS;
Здесь я включил заголовочный файл pipe () unistd.час сначала со следующей строкой.
#включатьЗатем в основной() функции, я определил pipefds двухэлементный целочисленный массив со следующей строкой.
int pipefds [2];Затем я запустил функцию pipe () для инициализации массива файловых дескрипторов pipefds следующим образом.
труба (pipefds)Я также проверил на наличие ошибок, используя возвращаемое значение функции pipe (). Я использовал выход() функция для завершения программы в случае сбоя функции канала.
if (pipe (pipefds) == -1)perror («труба»);
выход (EXIT_FAILURE);
Затем я распечатал значение дескрипторов файлов канала чтения и записи pipefds [0] а также pipefds [1] соответственно.
printf ("Прочитать значение дескриптора файла:% d \ n", pipefds [0]);printf ("Записать значение дескриптора файла:% d \ n", pipefds [1]);
Если вы запустите программу, вы должны увидеть следующий результат. Как видите, значение файлового дескриптора канала чтения pipefds [0] является 3 и напишите дескриптор файла pipe pipefds [1] является 4.
Пример 2:
Создайте еще один исходный файл на C 2_труба.c и введите следующие строки кодов.
#включать#включать
#включать
#включать
int main (void)
int pipefds [2];
char buffer [5];
if (pipe (pipefds) == -1)
perror («труба»);
выход (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Запись PIN-кода в канал… \ n");
написать (pipefds [1], pin, 5);
printf ("Готово.\ n \ n ");
printf ("Считывание ПИН-кода из канала… \ n");
чтение (pipefds [0], буфер, 5);
printf ("Готово.\ n \ n ");
printf ("ПИН-код из канала:% s \ n", буфер);
вернуть EXIT_SUCCESS;
Эта программа в основном показывает вам, как писать в канал и читать данные, которые вы написали из канала.
Здесь я сохранил 4-значный PIN-код в символ множество. Длина массива 5 (включая символ NULL \ 0).
char * pin = "4128 \ 0";Каждый символ ASCII имеет размер 1 байт в C. Итак, чтобы отправить 4-значный PIN-код через канал, вы должны записать 5 байтов (4 + 1 символ NULL) данных в канал.
Чтобы записать 5 байтов данных (штырь) в трубу, я использовал написать() функция, использующая файловый дескриптор канала записи pipefds [1] следующим образом.
написать (pipefds [1], pin, 5);Теперь, когда у меня есть данные в конвейере, я могу прочитать их из канала, используя читать() функция в файловом дескрипторе канала чтения pipefds [0]. Как я написал 5 байтов данных (штырь) в канал, я также буду читать 5 байтов данных из канала. Считанные данные будут сохранены в буфер массив символов. Поскольку я буду читать 5 байтов данных из канала, буфер символьный массив должен быть не менее 5 байтов.
Я определил буфер массив символов в начале основной() функция.
char buffer [5];Теперь я могу прочитать PIN-код из канала и сохранить его в буфер массив со следующей строкой.
чтение (pipefds [0], буфер, 5);Теперь, когда я прочитал PIN-код из трубы, я могу распечатать его с помощью printf () функционировать как обычно.
printf ("ПИН-код из канала:% s \ n", буфер);Как только я запускаю программу, отображается правильный результат, как вы можете видеть.
Пример 3:
Создайте новый исходный файл на C 3_трубка.c как введите следующие строки кодов.
#включать#включать
#включать
#включать
#включать
int main (void)
int pipefds [2];
char * pin;
char buffer [5];
if (pipe (pipefds) == -1)
perror («труба»);
выход (EXIT_FAILURE);
pid_t pid = fork ();
if (pid == 0) // в дочернем процессе
pin = "4821 \ 0"; // PIN для отправки
закрыть (pipefds [0]); // закрываем чтение fd
написать (pipefds [1], pin, 5); // записываем PIN-код в канал
printf ("Создание ПИН-кода в дочернем и отправка родительскому… \ n");
сон (2); // преднамеренная задержка
выход (EXIT_SUCCESS);
if (pid> 0) // в основном процессе
ждать (NULL); // ждем завершения дочернего процесса
закрыть (pipefds [1]); // закрываем запись fd
чтение (pipefds [0], буфер, 5); // считываем PIN-код из канала
закрыть (pipefds [0]); // закрываем чтение fd
printf ("Родитель получил PIN-код '% s' \ n", буфер);
вернуть EXIT_SUCCESS;
В этом примере я показал вам, как использовать канал для межпроцессного взаимодействия. Я отправил ПИН-код от дочернего процесса родительскому процессу с помощью канала. Затем прочтите ПИН-код из канала в родительском процессе и распечатайте его из родительского процесса.
Во-первых, я создал дочерний процесс с помощью функции fork ().
pid_t pid = fork ();Затем в дочернем процессе (pid == 0), Я написал пин-код в трубу с помощью написать() функция.
написать (pipefds [1], pin, 5);После того, как ПИН-код записан в канал от дочернего процесса, родительский процесс (pid> 0) прочтите его из трубы, используя читать() функция.
чтение (pipefds [0], буфер, 5);Затем родительский процесс распечатал PIN-код, используя printf () функционировать как обычно.
printf ("Родитель получил PIN-код '% s' \ n", буфер);Как видите, запуск программы дает ожидаемый результат.
Пример 4:
Создайте новый исходный файл на C 4_трубка.c как введите следующие строки кодов.
#включать#включать
#включать
#включать
#включать
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
контакт [0] = 49 + rand ()% 7;
для (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;
контакт [PIN_LENGTH] = '\ 0';
int main (void)
в то время как (1)
int pipefds [2];
символьный PIN-код [PIN_LENGTH + 1];
буфер символов [PIN_LENGTH + 1];
труба (пайпфдс);
pid_t pid = fork ();
if (pid == 0)
getPIN (контакт); // генерируем PIN-код
закрыть (pipefds [0]); // закрываем чтение fd
написать (pipefds [1], pin, PIN_LENGTH + 1); // записываем PIN-код в канал
printf ("Создание ПИН-кода в дочернем и отправка родительскому… \ n");
спать (PIN_WAIT_INTERVAL); // намеренная задержка генерации PIN-кода.
выход (EXIT_SUCCESS);
if (pid> 0)
ждать (NULL); // ждем, пока ребенок закончит
закрыть (pipefds [1]); // закрываем запись fd
чтение (pipefds [0], буфер, PIN_LENGTH + 1); // считываем PIN-код из канала
закрыть (pipefds [0]); // закрываем чтение fd
printf ("Родитель получил PIN-код '% s' от дочернего.\ n \ n ", буфер);
вернуть EXIT_SUCCESS;
Этот пример такой же, как Пример 3. Единственное отличие состоит в том, что эта программа постоянно создает дочерний процесс, генерирует PIN-код в дочернем процессе и отправляет PIN-код родительскому процессу с помощью канала.
Затем родительский процесс считывает PIN-код из канала и распечатывает его.
Эта программа генерирует новый PIN-код PIN_LENGTH каждые PIN_WAIT_INTERVAL сек.
Как видите, программа работает как положено.
Вы можете остановить программу, только нажав
Итак, вот как вы используете системный вызов pipe () на языке программирования C. Спасибо, что прочитали эту статью.