Синтаксисът на тръба() функцията е:
intтръба(intpipefd[2]);
Тук функцията pipe () създава еднопосочен канал за данни за комуникация между процесите. Преминавате в int (Integer) тип масив pipefd състоящ се от 2 елемента на масива към функцията pipe (). Тогава функцията pipe () създава два файлови дескриптора в pipefd масив.
Първият елемент на pipefd масив, pipefd [0] се използва за четене на данни от тръбата.
Вторият елемент на pipefd масив, pipefd [1] се използва за записване на данни в тръбата.
При успех функцията pipe () връща 0. Ако възникне грешка по време на инициализацията на тръбата, тогава функцията pipe () връща -1.
Функцията pipe () е дефинирана в заглавката unistd.h . За да използвате функцията pipe () във вашата C програма, трябва да включите заглавката unistd.h както следва:
#включва
За повече информация относно системната функция pipe () проверете страницата man на pipe () със следната команда:
$ човек2тръбаЧовешката страница на тръбата().
Пример 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 първо със следния ред.
#включваСлед това, в main () функция, дефинирах 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 и напишете дескриптор на файлови тръби 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-знаков ПИН код в char масив. Дължината на масива е 5 (включително символа NULL 0).
char *щифт= 4128 0';Всеки ASCII символ е с размер 1 байт в C. Така че, за да изпратите 4 -цифрения ПИН през тръбата, трябва да напишете 5 байта (4 + 1 NULL символ) данни в тръбата.
За да напишете 5 байта данни ( щифт ) в тръбата, използвах пиши () функция, използвайки файловия дескриптор на тръбата за запис pipefds [1] както следва.
пиши(pipefds[1],щифт, 5);Сега, когато имам някои данни в тръбата, мога да ги прочета от тръбата с помощта на Прочети() функция на файловия дескриптор за четене на тръба pipefds [0] . Тъй като съм написал 5 байта данни ( щифт ) в тръбата ще чета и 5 байта данни от тръбата. Прочетените данни ще се съхраняват в буфер символен масив. Тъй като ще чета 5 байта данни от тръбата, буфер символният масив трябва да е с дължина поне 5 байта.
Аз съм дефинирал буфер символен масив в началото на main () функция.
charбуфер[5];Сега мога да прочета ПИН кода от тръбата и да го съхраня в буфер масив със следния ред.
Прочети(pipefds[0],буфер, 5);След като прочетох ПИН кода от тръбата, мога да го отпечатам с помощта на printf () функционира както обикновено.
printf („ПИН от тръбата: %sн',буфер);След като стартирам програмата, се показва правилния изход, както можете да видите.
Пример 3:
Създайте нов C изходен файл 3_pipe.c като тип в следващите редове кодове.
#включва#включва
#включва
#включва
#включва
intглавен(невалиден) {
intpipefds[2];
char *щифт;
charбуфер[5];
ако(тръба(pipefds) == -1) {
ужас ('тръба');
изход (EXIT_FAILURE);
}
pid_t pid=вилица();
ако(пид== 0) { // в дочерния процес
щифт= 4821 0'; // ПИН за изпращане
близо(pipefds[0]); // затваряне на четене fd
пиши(pipefds[1],щифт, 5); // запис на ПИН в тръба
printf („Генериране на ПИН в дете и изпращане на родител ...н');
сън(2); // умишлено забавяне
изход (EXIT_SUCCESS);
}
ако(пид> 0) { // в основния процес
изчакайте(НУЛА); // изчакайте завършването на дъщерния процес
близо(pipefds[1]); // затваряне на запис fd
Прочети(pipefds[0],буфер, 5); // четене на PIN от тръбата
близо(pipefds[0]); // затваряне на четене fd
printf („Родителят е получил ПИН код„%s “н',буфер);
}
връщанеEXIT_SUCCESS;
}
В този пример ви показах как да използвате тръба за комуникация между процесите. Изпратих ПИН код от дъщерния процес до родителския процес, използвайки канал. След това прочетете ПИН кода от тръбата в родителския процес и го отпечатайте от родителския процес.
Първо, създадох дъщерен процес, използвайки функцията fork ().
pid_t pid=вилица();След това в процеса на детето ( pid == 0 ), Написах ПИН кода с помощта на пиши () функция.
пиши(pipefds[1],щифт, 5);След като ПИН е записан в тръбата от дъщерния процес, родителският процес ( pid> 0 ) прочетете го от тръбата с помощта на Прочети() функция.
Прочети(pipefds[0],буфер, 5);След това родителският процес отпечатва ПИН кода с помощта printf () функционира както обикновено.
printf („Родителят е получил ПИН код„%s “н',буфер);Както можете да видите, стартирането на програмата дава очаквания резултат.
Пример 4:
Създайте нов C изходен файл 4_pipe.c като тип в следващите редове кодове.
#включва#включва
#включва
#включва
#включва
#дефинирайте PIN_LENGTH 4
#дефинирайте PIN_WAIT_INTERVAL 2
невалиденgetPIN(charщифт[PIN_LENGTH+ 1]) {
srand (избухвам() +getppid());
щифт[0] = 49 + ред () % 7;
за(inti= 1;i<PIN_LENGTH;i++) {
щифт[i] = 48 + ред () % 7;
}
щифт[PIN_LENGTH] = ' 0';
}
intглавен(невалиден) {
докато(1) {
intpipefds[2];
charщифт[PIN_LENGTH+ 1];
charбуфер[PIN_LENGTH+ 1];
тръба(pipefds);
pid_t pid=вилица();
ако(пид== 0) {
getPIN(щифт); // генериране на ПИН
близо(pipefds[0]); // затваряне на четене fd
пиши(pipefds[1],щифт,PIN_LENGTH+ 1); // запис на ПИН в тръба
printf („Генериране на ПИН в дете и изпращане на родител ...н');
сън(PIN_WAIT_INTERVAL); // умишлено забавяне на генерирането на ПИН.
изход (EXIT_SUCCESS);
}
ако(пид> 0) {
изчакайте(НУЛА); // чакаме детето да завърши
близо(pipefds[1]); // затваряне на запис fd
Прочети(pipefds[0],буфер,PIN_LENGTH+ 1); // четене на PIN от тръбата
близо(pipefds[0]); // затваряне на четене fd
printf („Родителят е получил ПИН код„%s “от дете.нн',буфер);
}
}
връщанеEXIT_SUCCESS;
}
Този пример е същият като Пример 3 . Единствената разлика е, че тази програма непрекъснато създава потомствен процес, генерира ПИН код в дочерния процес и изпраща ПИН кода на родителския процес, използвайки канал.
След това родителският процес чете ПИН кода от тръбата и го отпечатва.
Тази програма генерира нов PIN_LENGTH PIN на всеки PIN_WAIT_INTERVAL секунди.
Както можете да видите, програмата работи според очакванията.
Можете да спрете програмата само с натискане + ° С .
Така че, по този начин използвате системния извикване pipe () в езика за програмиране на C. Благодаря, че прочетохте тази статия.