Синтаксис трубка() функция:
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. Спасибо, что прочитали эту статью.