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

Системный вызов трубы в C

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

Все о 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 сек.

Как видите, программа работает как положено.

Вы можете остановить программу, только нажав + C.

Итак, вот как вы используете системный вызов pipe () на языке программирования C. Спасибо, что прочитали эту статью.

OpenTTD против Simutrans
Создание собственного транспортного симулятора может быть увлекательным, расслабляющим и чрезвычайно увлекательным занятием. Вот почему вам нужно попр...
Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...