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

Pipe System Call C



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

Синтаксис трубка() функция:







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

Здесь функция pipe () создает однонаправленный канал данных для межпроцессного взаимодействия. Вы проходите через int (Целочисленный) массив типов pipefd состоящий из 2 элементов массива для функции pipe (). Затем функция pipe () создает два файловых дескриптора в pipefd множество.



Первый элемент pipefd множество, pipefd [0] используется для чтения данных из канала.



Второй элемент pipefd множество, pipefd [1] используется для записи данных в канал.





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

Функция pipe () определена в заголовке unistd.h . Чтобы использовать функцию pipe () в вашей программе на C, вы должны включить заголовок unistd.h следующее:



#включают

Для получения дополнительной информации о системной функции pipe () проверьте страницу руководства pipe () с помощью следующей команды:

$ человек2трубка
Страница руководства pipe().

Пример 1:

Для первого примера создайте новый исходный файл C 1_pipe.c и введите следующие строки кодов.

#включают
#включают
#включают

intглавный(пустота) {
intpipefds[2];

если(трубка(pipefds) == -1) {
перрор ('трубка');
выход (EXIT_FAILURE);
}

printf ('Прочитать значение дескриптора файла:% d п',pipefds[0]);
printf ('Запись значения дескриптора файла:% d п',pipefds[1]);

возвращениеEXIT_SUCCESS;
}

Здесь я включил заголовочный файл pipe () unistd.h сначала со следующей строкой.

#включают

Затем в главный() функции, я определил pipefds двухэлементный целочисленный массив со следующей строкой.

intpipefds[2];

Затем я запустил функцию pipe () для инициализации массива файловых дескрипторов. pipefds следующее.

трубка(pipefds)

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

если(трубка(pipefds) == -1) {
перрор ('трубка');
выход (EXIT_FAILURE);
}

Затем я распечатал значение дескрипторов файлов канала чтения и записи. pipefds [0] а также pipefds [1] соответственно.

printf ('Прочитать значение дескриптора файла:% d п',pipefds[0]);
printf ('Запись значения дескриптора файла:% d п',pipefds[1]);

Если вы запустите программу, вы должны увидеть следующий результат. Как видите, значение файлового дескриптора канала чтения pipefds [0] является 3 и напишите дескриптор файла pipe pipefds [1] является 4 .

Пример 2:

Создайте еще один исходный файл на C 2_pipe.c и введите следующие строки кодов.

#включают
#включают
#включают
#включают

intглавный(пустота) {
intpipefds[2];
charбуфер[5];

если(трубка(pipefds) == -1) {
перрор ('трубка');
выход (EXIT_FAILURE);
}

char *штырьзнак равно '4128 0';

printf ('Запись ПИН-кода в трубу ... п');
записывать(pipefds[1],штырь, 5);
printf ('Выполнено. п п');

printf ('Считывание ПИН-кода из трубы ... п');
читать(pipefds[0],буфер, 5);
printf ('Выполнено. п п');

printf ('ПИН-код из трубы:% s п',буфер);

возвращениеEXIT_SUCCESS;
}

Эта программа в основном показывает вам, как писать в канал и читать данные, которые вы записали из канала.

Здесь я сохранил 4-значный PIN-код в char множество. Длина массива 5 (включая символ NULL 0).

char *штырьзнак равно '4128 0';

Каждый символ ASCII имеет размер 1 байт в C. Таким образом, чтобы отправить 4-значный PIN-код через канал, вы должны записать 5 байтов (4 + 1 символ NULL) в канал.

Чтобы записать 5 байтов данных ( штырь ) в трубу, я использовал записывать() функция, использующая файловый дескриптор канала записи pipefds [1] следующее.

записывать(pipefds[1],штырь, 5);

Теперь, когда у меня есть данные в конвейере, я могу прочитать их из канала, используя читать() функция в файловом дескрипторе канала чтения pipefds [0] . Поскольку я написал 5 байтов данных ( штырь ) в канал, я также буду читать 5 байтов данных из канала. Считанные данные будут сохранены в буфер символьный массив. Поскольку я буду читать 5 байтов данных из канала, буфер Символьный массив должен быть не менее 5 байтов.

Я определил буфер массив символов в начале главный() функция.

charбуфер[5];

Теперь я могу прочитать PIN-код из канала и сохранить его в буфер массив со следующей строкой.

читать(pipefds[0],буфер, 5);

Теперь, когда я прочитал PIN-код из трубы, я могу распечатать его с помощью printf () работают как обычно.

printf ('ПИН-код из трубы:% s п',буфер);

Как вы можете видеть, после запуска программы отображается правильный результат.

Пример 3:

Создайте новый исходный файл на C 3_pipe.c как введите следующие строки кодов.

#включают
#включают
#включают
#включают
#включают
intглавный(пустота) {
intpipefds[2];
char *штырь;
charбуфер[5];

если(трубка(pipefds) == -1) {
перрор ('трубка');
выход (EXIT_FAILURE);
}

pid_t pidзнак равновилка();

если(пид== 0) { // в дочернем процессе
штырьзнак равно '4821 0'; // PIN для отправки
близко(pipefds[0]); // закрываем чтение fd
записывать(pipefds[1],штырь, 5); // записываем PIN-код в канал

printf ('Создание ПИН-кода в дочернем и отправка родительскому ... п');
спать(2); // преднамеренная задержка
выход (EXIT_SUCCESS);
}

если(пид> 0) { // в основном процессе
ждать(НУЛЕВОЙ); // ждем завершения дочернего процесса
близко(pipefds[1]); // закрываем запись fd
читать(pipefds[0],буфер, 5); // считываем PIN-код из канала
близко(pipefds[0]); // закрываем чтение fd

printf ('Родитель получил PIN-код'% s ' п',буфер);
}

возвращениеEXIT_SUCCESS;
}

В этом примере я показал вам, как использовать канал для межпроцессного взаимодействия. Я отправил PIN-код от дочернего процесса родительскому процессу с помощью канала. Затем прочтите PIN-код из канала в родительском процессе и распечатайте его из родительского процесса.

Во-первых, я создал дочерний процесс с помощью функции fork ().

pid_t pidзнак равновилка();

Затем в дочернем процессе ( pid == 0 ), Я написал пин-код в трубу с помощью записывать() функция.

записывать(pipefds[1],штырь, 5);

После того, как ПИН-код записан в канал от дочернего процесса, родительский процесс ( pid> 0 ) прочтите его из трубы, используя читать() функция.

читать(pipefds[0],буфер, 5);

Затем родительский процесс распечатал PIN-код, используя printf () работают как обычно.

printf ('Родитель получил PIN-код'% s ' п',буфер);

Как видите, запуск программы дает ожидаемый результат.

Пример 4:

Создайте новый исходный файл на C 4_pipe.c как введите следующие строки кодов.

#включают
#включают
#включают
#включают
#включают

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

пустотаgetPIN(charштырь[PIN_LENGTH+ 1]) {
srand (Getpid() +Getppid());

штырь[0] знак равно 49 + ряд () % 7;

для(intязнак равно 1;я<PIN_LENGTH;я++) {
штырь[я] знак равно 48 + ряд () % 7;
}

штырь[PIN_LENGTH] знак равно ' 0';
}


intглавный(пустота) {
в то время как(1) {
intpipefds[2];
charштырь[PIN_LENGTH+ 1];
charбуфер[PIN_LENGTH+ 1];

трубка(pipefds);

pid_t pidзнак равновилка();

если(пид== 0) {
getPIN(штырь); // генерируем PIN-код
близко(pipefds[0]); // закрываем чтение fd
записывать(pipefds[1],штырь,PIN_LENGTH+ 1); // записываем PIN-код в канал

printf ('Создание ПИН-кода в дочернем и отправка родительскому ... п');

спать(PIN_WAIT_INTERVAL); // намеренная задержка генерации PIN-кода.

выход (EXIT_SUCCESS);
}

если(пид> 0) {
ждать(НУЛЕВОЙ); // ждем, пока ребенок закончит

близко(pipefds[1]); // закрываем запись fd
читать(pipefds[0],буфер,PIN_LENGTH+ 1); // считываем PIN-код из канала
близко(pipefds[0]); // закрываем чтение fd
printf ('Родитель получил PIN-код'% s 'от ребенка. п п',буфер);
}
}

возвращениеEXIT_SUCCESS;
}

Этот пример такой же, как Пример 3 . Единственное отличие состоит в том, что эта программа постоянно создает дочерний процесс, генерирует PIN-код в дочернем процессе и отправляет PIN-код родительскому процессу с помощью канала.

Затем родительский процесс считывает ПИН-код из канала и распечатывает его.

Эта программа генерирует новый PIN-код PIN_LENGTH каждые PIN_WAIT_INTERVAL секунд.

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

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

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